- Fixed #16160: Call to undefined function ezi18n()
[tinyz:tinyz.git] / kernel / visual / templatecreate.php
1 <?php
2 //
3 // Created on: <09-May-2003 10:44:02 bf>
4 //
5 // ## BEGIN COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
6 // SOFTWARE NAME: eZ Publish
7 // SOFTWARE RELEASE: 4.1.x
8 // COPYRIGHT NOTICE: Copyright (C) 1999-2010 eZ Systems AS
9 // SOFTWARE LICENSE: GNU General Public License v2.0
10 // NOTICE: >
11 //   This program is free software; you can redistribute it and/or
12 //   modify it under the terms of version 2.0  of the GNU General
13 //   Public License as published by the Free Software Foundation.
14 //
15 //   This program is distributed in the hope that it will be useful,
16 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
17 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 //   GNU General Public License for more details.
19 //
20 //   You should have received a copy of version 2.0 of the GNU General
21 //   Public License along with this program; if not, write to the Free
22 //   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
23 //   MA 02110-1301, USA.
24 //
25 //
26 // ## END COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
27 //
28
29 $http = eZHTTPTool::instance();
30 $module = $Params['Module'];
31 $parameters = $Params["Parameters"];
32
33 $overrideKeys = array( 'nodeID' => $Params['NodeID'],
34                        'classID' => $Params['ClassID'] );
35
36 require_once( "kernel/common/template.php" );
37 $ini = eZINI::instance();
38 $tpl = templateInit();
39
40 // Todo: read from siteaccess settings
41 $siteAccess = $Params['SiteAccess'];
42 if( $siteAccess )
43     $http->setSessionVariable( 'eZTemplateAdminCurrentSiteAccess', $siteAccess );
44 else
45     $siteAccess = $http->sessionVariable( 'eZTemplateAdminCurrentSiteAccess' );
46
47 $siteBase = $siteAccess;
48
49 $siteINI = eZINI::instance( 'site.ini', 'settings', null, null, true );
50 $siteINI->prependOverrideDir( "siteaccess/$siteAccess", false, 'siteaccess' );
51 $siteINI->loadCache();
52 $siteDesign = $siteINI->variable( "DesignSettings", "SiteDesign" );
53
54 $template = "";
55 foreach ( $parameters as $param )
56 {
57     $template .= "/$param";
58 }
59
60
61 $templateType = 'default';
62 if ( strpos( $template, "node/view" ) )
63 {
64     $templateType = 'node_view';
65 }
66 else if ( strpos( $template, "content/view" ) )
67 {
68     $templateType = 'object_view';
69 }
70 else if ( strpos( $template, "content/edit" ) )
71 {
72     $templateType = 'object_view';
73 }
74 else if ( strpos( $template, "pagelayout.tpl" ) )
75 {
76     $templateType = 'pagelayout';
77 }
78
79 $error = false;
80 $templateName = false;
81 $designExtension = '';
82
83 $designINI = eZINI::instance( 'design.ini' );
84 $designExtensionList = $designINI->variable( 'ExtensionSettings', 'DesignExtensions' );
85 if ( $designExtensionList !== array() )
86 {
87     $designExtension = $designExtensionList[0];
88 }
89
90 if ( $module->isCurrentAction( 'CreateOverride' ) )
91 {
92     $templateName = trim( $http->postVariable( 'TemplateName' ) );
93     if ( $http->hasPostVariable( 'DesignExtension' ) )
94     {
95         $designExtension = trim( $http->postVariable( 'DesignExtension' ) );
96     }
97
98     if ( preg_match( "#^[0-9a-z_]+$#", $templateName ) )
99     {
100         $templateName = trim( $http->postVariable( 'TemplateName' ) );
101         $filePath = "design/$siteDesign/override/templates";
102         if ( $designExtension !== '' )
103         {
104             $filePath = eZExtension::baseDirectory() . "/" . $designExtension . "/" . $filePath;
105         }
106         $fileName = $filePath . "/" . $templateName . ".tpl";
107
108         $templateCode = "";
109         switch ( $templateType )
110         {
111             case "node_view":
112             {
113                 $templateCode = generateNodeViewTemplate( $http, $template, $fileName );
114             }break;
115
116             case "object_view":
117             {
118                 $templateCode = generateObjectViewTemplate( $http, $template, $fileName );
119             }break;
120
121             case "pagelayout":
122             {
123                 $templateCode = generatePagelayoutTemplate( $http, $template, $fileName );
124             }break;
125
126             default:
127             {
128                 $templateCode = generateDefaultTemplate( $http, $template, $fileName );
129             }break;
130         }
131
132         if ( !file_exists( $filePath ) )
133         {
134             eZDir::mkdir( $filePath, false, true );
135         }
136
137
138         $fp = fopen( $fileName, "w+" );
139         if ( $fp )
140         {
141             $filePermission = $ini->variable( 'FileSettings', 'StorageFilePermissions' );
142             $oldumask = umask( 0 );
143             fwrite( $fp, $templateCode );
144             fclose( $fp );
145             chmod( $fileName, octdec( $filePermission ) );
146             umask( $oldumask );
147
148             // Store override.ini.append file
149             $overrideINI = eZINI::instance( 'override.ini', 'settings', null, null, true );
150             $overrideINI->prependOverrideDir( "siteaccess/$siteAccess", false, 'siteaccess' );
151             $overrideINI->loadCache();
152
153             $templateFile = preg_replace( "#^/(.*)$#", "\\1", $template );
154
155             $overrideINI->setVariable( $templateName, 'Source', $templateFile );
156             $overrideINI->setVariable( $templateName, 'MatchFile', $templateName . ".tpl" );
157             $overrideINI->setVariable( $templateName, 'Subdir', "templates" );
158
159             if ( $http->hasPostVariable( 'Match' ) )
160             {
161                 $matchArray = $http->postVariable( 'Match' );
162
163                 foreach ( array_keys( $matchArray ) as $matchKey )
164                 {
165                     if ( $matchArray[$matchKey] == -1 or trim( $matchArray[$matchKey] ) == "" )
166                         unset( $matchArray[$matchKey] );
167                 }
168                 $overrideINI->setVariable( $templateName, 'Match', $matchArray );
169             }
170
171             $oldumask = umask( 0 );
172             $overrideINI->save( "siteaccess/$siteAccess/override.ini.append" );
173             $overridePath = "settings/siteaccess/$siteAccess/override.ini.append.php";
174             if ( file_exists( $overridePath ) )
175             {
176                 $s = stat($overridePath);
177                 $mode = $s["mode"] & 0777; // get only the last 9 bits.
178                 if ($mode & $filePermission != $filePermission ) // filePermission wrong?
179                 {
180                     chmod( $overridePath, octdec( $filePermission ) );
181                 }
182             }
183             umask( $oldumask );
184
185             // Expire content view cache
186             eZContentCacheManager::clearAllContentCache();
187
188             // Clear override cache
189             $cachedDir = eZSys::cacheDirectory();
190             $cachedDir .= "/override/";
191             eZDir::recursiveDelete( $cachedDir );
192         }
193         else
194         {
195             $error = "permission_denied";
196             eZDebug::writeError( "Could not create override template, check permissions on $fileName", "Template override" );
197         }
198     }
199     else
200     {
201         $error = "invalid_name";
202     }
203
204     if ( $error == false )
205     {
206         $module->redirectTo( '/visual/templateview'. $template );
207         return eZModule::HOOK_STATUS_CANCEL_RUN;
208     }
209 }
210 else if( $module->isCurrentAction( 'CancelOverride' ) )
211 {
212    $module->redirectTo( '/visual/templateview'. $template );
213 }
214
215
216 function generateNodeViewTemplate( $http, $template, $fileName )
217 {
218     $matchArray = $http->postVariable( 'Match' );
219
220     $templateCode = "";
221     $classIdentifier = $matchArray['class_identifier'];
222
223     $class = eZContentClass::fetchByIdentifier( $classIdentifier );
224
225     // Check what kind of contents we should create in the template
226     switch ( $http->postVariable( 'TemplateContent' ) )
227     {
228         case 'DefaultCopy' :
229         {
230             $siteAccess = $http->sessionVariable( 'eZTemplateAdminCurrentSiteAccess' );
231             $overrideArray = eZTemplateDesignResource::overrideArray( $siteAccess );
232             $fileName = $overrideArray[$template]['base_dir'] . $overrideArray[$template]['template'];
233             $fp = fopen( $fileName, 'rb' );
234             if ( $fp )
235             {
236                 $codeFromFile = fread( $fp, filesize( $fileName ) );
237
238                 // Remove the "{* DO NOT EDIT... *}" first line (if exists).
239                 $templateCode = preg_replace('@^{\*\s*DO\sNOT\sEDIT.*?\*}\n(.*)@s', '$1', $codeFromFile);
240             }
241             else
242             {
243                 eZDebug::writeError( "Could not open file $fileName, check read permissions" );
244             }
245             fclose( $fp );
246         }break;
247
248         case 'ContainerTemplate' :
249         {
250             $templateCode = "<h1>{\$node.name}</h1>\n\n";
251
252             // Append attribute view
253             if ( $class instanceof eZContentClass )
254             {
255                 $attributes = $class->fetchAttributes();
256                 foreach ( $attributes as $attribute )
257                 {
258                     $identifier = $attribute->attribute( 'identifier' );
259                     $name = $attribute->attribute( 'name' );
260                     $templateCode .= "<h2>$name</h2>\n";
261                     $templateCode .= "{attribute_view_gui attribute=\$node.object.data_map.$identifier}\n\n";
262                 }
263             }
264
265             $templateCode .= "" .
266                  "{let page_limit=20\n" .
267                  "    children=fetch('content','list',hash(parent_node_id,\$node.node_id,sort_by,\$node.sort_array,limit,\$page_limit,offset,\$view_parameters.offset))" .
268                  "    list_count=fetch('content','list_count',hash(parent_node_id,\$node.node_id))}\n" .
269                  "\n" .
270                  "{section name=Child loop=\$children sequence=array(bglight,bgdark)}\n" .
271                  "{node_view_gui view=line content_node=\$Child:item}\n" .
272                  "{/section}\n" .
273
274                  "{include name=navigator\n" .
275                  "    uri='design:navigator/google.tpl'\n" .
276                  "    page_uri=concat('/content/view','/full/',\$node.node_id)\n" .
277                  "    item_count=\$list_count\n" .
278                  "    view_parameters=\$view_parameters\n" .
279                  "    item_limit=\$page_limit}\n";
280             "{/let}\n";
281         }break;
282
283         case 'ViewTemplate' :
284         {
285             $templateCode = "<h1>{\$node.name}</h1>\n\n";
286
287             // Append attribute view
288             if ( $class instanceof eZContentClass )
289             {
290                 $attributes = $class->fetchAttributes();
291                 foreach ( $attributes as $attribute )
292                 {
293                     $identifier = $attribute->attribute( 'identifier' );
294                     $name = $attribute->attribute( 'name' );
295                     $templateCode .= "<h2>$name</h2>\n";
296                     $templateCode .= "{attribute_view_gui attribute=\$node.object.data_map.$identifier}\n\n";
297                 }
298             }
299
300         }break;
301
302         default:
303         case 'EmptyFile' :
304         {
305         }break;
306     }
307
308     return $templateCode;
309 }
310
311
312 function generateObjectViewTemplate( $http, $template, $fileName )
313 {
314     $matchArray = $http->postVariable( 'Match' );
315
316     $templateCode = "";
317     $classID = $matchArray['class'];
318
319     $class = eZContentClass::fetch( $classID );
320
321     // Check what kind of contents we should create in the template
322     switch ( $http->postVariable( 'TemplateContent' ) )
323     {
324         case 'DefaultCopy' :
325         {
326             $siteAccess = $http->sessionVariable( 'eZTemplateAdminCurrentSiteAccess' );
327             $overrideArray = eZTemplateDesignResource::overrideArray( $siteAccess );
328             $fileName = $overrideArray[$template]['base_dir'] . $overrideArray[$template]['template'];
329             $fp = fopen( $fileName, 'rb' );
330             if ( $fp )
331             {
332                 $codeFromFile = fread( $fp, filesize( $fileName ) );
333
334                 // Remove the "{* DO NOT EDIT... *}" first line (if exists).
335                 $templateCode = preg_replace('@^{\*\s*DO\sNOT\sEDIT.*?\*}\n(.*)@s', '$1', $codeFromFile);
336             }
337             else
338             {
339                 eZDebug::writeError( "Could not open file $fileName, check read permissions" );
340             }
341             fclose( $fp );
342         }break;
343
344         case 'ViewTemplate' :
345         {
346             $templateCode = "<h1>{\$object.name}</h1>\n\n";
347
348             // Append attribute view
349             if ( $class instanceof eZContentClass )
350             {
351                 $attributes = $class->fetchAttributes();
352                 foreach ( $attributes as $attribute )
353                 {
354                     $identifier = $attribute->attribute( 'identifier' );
355                     $name = $attribute->attribute( 'name' );
356                     $templateCode .= "<h2>$name</h2>\n";
357                     $templateCode .= "{attribute_view_gui attribute=\$object.data_map.$identifier}\n\n";
358                 }
359             }
360
361         }break;
362
363         default:
364         case 'EmptyFile' :
365         {
366         }break;
367     }
368     return $templateCode;
369 }
370
371 function generatePagelayoutTemplate( $http, $template, $fileName )
372 {
373     $templateCode = "";
374     // Check what kind of contents we should create in the template
375     switch ( $http->postVariable( 'TemplateContent' ) )
376     {
377         case 'DefaultCopy' :
378         {
379             $siteAccess = $http->sessionVariable( 'eZTemplateAdminCurrentSiteAccess' );
380             $overrideArray = eZTemplateDesignResource::overrideArray( $siteAccess );
381             $fileName = $overrideArray[$template]['base_dir'] . $overrideArray[$template]['template'];
382             $fp = fopen( $fileName, 'rb' );
383             if ( $fp )
384             {
385                 $codeFromFile = fread( $fp, filesize( $fileName ) );
386
387                 // Remove the "{* DO NOT EDIT... *}" first line (if exists).
388                 $templateCode = preg_replace('@^{\*\s*DO\sNOT\sEDIT.*?\*}\n(.*)@s', '$1', $codeFromFile);
389             }
390             else
391             {
392                 eZDebug::writeError( "Could not open file $fileName, check read permissions" );
393             }
394             fclose( $fp );
395         }break;
396
397         default:
398         case 'EmptyFile' :
399         {
400             $templateCode = '{*?template charset=latin1?*}' .
401                  '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ' .
402                  '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' . "\n" .
403                  '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="no" lang="no">' .
404                  '<head>' . "\n" .
405                  '    <link rel="stylesheet" type="text/css" href={"stylesheets/core.css"|ezdesign} />' . "\n" .
406                  '    <link rel="stylesheet" type="text/css" href={"stylesheets/debug.css"|ezdesign} />' . "\n" .
407                  '    {include uri="design:page_head.tpl"}' . "\n" .
408                  '</head>' . "\n" .
409                  '<body>' . "\n" .
410                  '{$module_result.content}' . "\n" .
411                  '<!--DEBUG_REPORT-->' . "\n" .
412                  '</body>' . "\n" .
413                  '</html>' . "\n";
414         }break;
415     }
416     return $templateCode;
417 }
418
419 function generateDefaultTemplate( $http, $template, $fileName )
420 {
421     $templateCode = "";
422     // Check what kind of contents we should create in the template
423     switch ( $http->postVariable( 'TemplateContent' ) )
424     {
425         case 'DefaultCopy' :
426         {
427             $siteAccess = $http->sessionVariable( 'eZTemplateAdminCurrentSiteAccess' );
428             $overrideArray = eZTemplateDesignResource::overrideArray( $siteAccess );
429             $fileName = $overrideArray[$template]['base_dir'] . $overrideArray[$template]['template'];
430             $fp = fopen( $fileName, 'rb' );
431             if ( $fp )
432             {
433                 $codeFromFile = fread( $fp, filesize( $fileName ) );
434
435                 // Remove the "{* DO NOT EDIT... *}" first line (if exists).
436                 $templateCode = preg_replace('@^{\*\s*DO\sNOT\sEDIT.*?\*}\n(.*)@s', '$1', $codeFromFile);
437             }
438             else
439             {
440                 eZDebug::writeError( "Could not open file $fileName, check read permissions" );
441             }
442             fclose( $fp );
443         }break;
444
445         default:
446         case 'EmptyFile' :
447         {
448             $templateCode = '{*?template charset=latin1?*}' .
449                  '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ' .
450                  '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' . "\n" .
451                  '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="no" lang="no">' .
452                  '<head>' . "\n" .
453                  '    <link rel="stylesheet" type="text/css" href={"stylesheets/core.css"|ezdesign} />' . "\n" .
454                  '    <link rel="stylesheet" type="text/css" href={"stylesheets/debug.css"|ezdesign} />' . "\n" .
455                  '    {include uri="design:page_head.tpl"}' . "\n" .
456                  '</head>' . "\n" .
457                  '<body>' . "\n" .
458                  '{$module_result.content}' . "\n" .
459                  '<!--DEBUG_REPORT-->' . "\n" .
460                  '</body>' . "\n" .
461                  '</html>' . "\n";
462         }break;
463     }
464     return $templateCode;
465 }
466
467
468 $tpl->setVariable( 'error', $error );
469 $tpl->setVariable( 'template', $template );
470 $tpl->setVariable( 'template_type', $templateType );
471 $tpl->setVariable( 'template_name', $templateName );
472 $tpl->setVariable( 'site_base', $siteBase );
473 $tpl->setVariable( 'site_design', $siteDesign );
474 $tpl->setVariable( 'override_keys', $overrideKeys );
475 $tpl->setVariable( 'design_extension', $designExtension );
476
477 $Result = array();
478 $Result['content'] = $tpl->fetch( "design:visual/templatecreate.tpl" );
479 $Result['path'] = array( array( 'url' => "/visual/templatelist/",
480                                 'text' => ezpI18n::translate( 'kernel/design', 'Template list' ) ),
481                          array( 'url' => "/visual/templateview". $template,
482                                 'text' => ezpI18n::translate( 'kernel/design', 'Template view' ) ),
483                          array( 'url' => false,
484                                 'text' => ezpI18n::translate( 'kernel/design', 'Create new template' ) ) );
485 ?>