Overview

Packages

  • CONTENIDO
  • Core
    • Authentication
    • Backend
    • Cache
    • CEC
    • Chain
    • ContentType
    • Database
    • Debug
    • Exception
    • Frontend
      • Search
      • URI
      • Util
    • GenericDB
      • Model
    • GUI
      • HTML
    • I18N
    • LayoutHandler
    • Log
    • Security
    • Session
    • Util
    • Validation
    • Versioning
    • XML
  • Module
    • ContentRssCreator
    • ContentSitemapHtml
    • ContentSitemapXml
    • ContentUserForum
    • NavigationTop
    • ScriptCookieDirective
  • mpAutoloaderClassMap
  • None
  • Plugin
    • ContentAllocation
    • CronjobOverview
    • FormAssistant
    • FrontendLogic
    • FrontendUsers
    • Linkchecker
    • ModRewrite
    • Newsletter
    • Repository
      • FrontendNavigation
      • KeywordDensity
    • SearchSolr
    • SmartyWrapper
    • UrlShortener
    • UserForum
    • Workflow
  • PluginManager
  • Setup
    • Form
    • GUI
    • Helper
      • Environment
      • Filesystem
      • MySQL
      • PHP
    • UpgradeJob

Classes

  • cCodeGeneratorAbstract
  • cCodeGeneratorFactory
  • cCodeGeneratorStandard
  • cContentTypeAbstract
  • cContentTypeAbstractTabbed
  • cContentTypeDate
  • cContentTypeFilelist
  • cContentTypeHead
  • cContentTypeHtml
  • cContentTypeHtmlhead
  • cContentTypeImg
  • cContentTypeImgdescr
  • cContentTypeImgeditor
  • cContentTypeLink
  • cContentTypeLinkdescr
  • cContentTypeLinkeditor
  • cContentTypeLinktarget
  • cContentTypeRaw
  • cContentTypeTeaser
  • cContentTypeText
  • cTypeGenerator
  • Overview
  • Package
  • Class
  • Tree
  • Deprecated
  • Todo
  1: <?php
  2: 
  3: /**
  4:  * This file contains the abstract CONTENIDO code generator class.
  5:  *
  6:  * @package Core
  7:  * @subpackage ContentType
  8:  * @author Murat Purc <murat@purc.de>
  9:  * @copyright four for business AG <www.4fb.de>
 10:  * @license http://www.contenido.org/license/LIZENZ.txt
 11:  * @link http://www.4fb.de
 12:  * @link http://www.contenido.org
 13:  */
 14: 
 15: defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
 16: 
 17: /**
 18:  * Abstract CONTENIDO code generator class.
 19:  *
 20:  * @package Core
 21:  * @subpackage ContentType
 22:  */
 23: abstract class cCodeGeneratorAbstract {
 24: 
 25:     /**
 26:      * CONTENIDO database instance.
 27:      *
 28:      * @var cDb
 29:      */
 30:     protected $_db;
 31: 
 32:     /**
 33:      * Frontend debug options.
 34:      *
 35:      * @see $frontend_debug in __FRONTEND_PATH__/data/config/config.php
 36:      * @var array
 37:      */
 38:     protected $_feDebugOptions = array();
 39: 
 40:     /**
 41:      * Collected CSS data for current template.
 42:      *
 43:      * @var string
 44:      */
 45:     protected $_cssData = '';
 46: 
 47:     /**
 48:      * Collected JS data for current template.
 49:      *
 50:      * @var string
 51:      */
 52:     protected $_jsData = '';
 53: 
 54:     /**
 55:      * Template name.
 56:      *
 57:      * @var string
 58:      */
 59:     protected $_tplName = '';
 60: 
 61:     /**
 62:      * Category id.
 63:      *
 64:      * @var int
 65:      */
 66:     protected $_idcat;
 67: 
 68:     /**
 69:      * Article id.
 70:      *
 71:      * @var int
 72:      */
 73:     protected $_idart;
 74: 
 75:     /**
 76:      * Language id.
 77:      *
 78:      * @var int
 79:      */
 80:     protected $_lang;
 81: 
 82:     /**
 83:      * Client id.
 84:      *
 85:      * @var int
 86:      */
 87:     protected $_client;
 88: 
 89:     /**
 90:      * Flag to process layout.
 91:      *
 92:      * @var bool
 93:      */
 94:     protected $_layout;
 95: 
 96:     /**
 97:      * Flag to persist generated code.
 98:      *
 99:      * @var bool
100:      */
101:     protected $_save;
102: 
103:     /**
104:      * Article language id.
105:      *
106:      * @var int
107:      */
108:     protected $_idartlang;
109: 
110:     /**
111:      * Page title.
112:      * Usually from article language table.
113:      *
114:      * @var string
115:      */
116:     protected $_pageTitle;
117: 
118:     /**
119:      * Layout code.
120:      * Initially with container tags which will be replaced by module output.
121:      *
122:      * @var string
123:      */
124:     protected $_layoutCode = '';
125: 
126:     /**
127:      * Module output code prefix.
128:      *
129:      * @var array
130:      */
131:     protected $_modulePrefix = array();
132: 
133:     /**
134:      * Module output code.
135:      *
136:      * @var string
137:      */
138:     protected $_moduleCode = '';
139: 
140:     /**
141:      * Module output code suffix.
142:      *
143:      * @var array
144:      */
145:     protected $_moduleSuffix = array();
146: 
147:     /**
148:      * Article language.
149:      *
150:      * @var cApiArticleLanguage
151:      */
152:     protected $_oArtLang;
153: 
154:     /**
155:      * Constructor.
156:      */
157:     public function __construct() {
158:         $this->_db = cRegistry::getDb();
159:     }
160: 
161:     /**
162:      * Setter for frontend debug options.
163:      *
164:      * @see $frontend_debug in __FRONTEND_PATH__/data/config/config.php
165:      *         located in clients frontend directory
166:      * @param array $debugOptions
167:      */
168:     public function setFrontendDebugOptions(array $debugOptions) {
169:         $this->_feDebugOptions = $debugOptions;
170:     }
171: 
172:     /**
173:      * Generates the code for a specific article (article for a client in a
174:      * language).
175:      *
176:      * @param int $idcat
177:      * @param int $idart
178:      * @param int $lang
179:      * @param int $client
180:      * @param bool $layout [optional]
181:      *         This params purpose is unclear.
182:      * @param bool $save [optional]
183:      *         Flag to persist generated code.
184:      * @param bool $contype [optional]
185:      *         Flag to enable/disable replacement of CMS_TAGS[].
186:      * @param bool $editable [optional]
187:      * @param int|NULL $version [optional]
188:      * @throws cInvalidArgumentException
189:      *         If an article with the given idart and idlang can not be loaded.
190:      * @return string
191:      *         Generated code or error code '0601' if no template configuration
192:      *         was found for category or article.
193:      */
194:     public function generate(
195:         $idcat, $idart, $lang, $client, $layout = false, $save = true,
196:         $contype = true, $editable = true, $version = NULL
197:     ) {
198: 
199:         $this->_idcat = (int) $idcat;
200:         $this->_idart = (int) $idart;
201:         $this->_lang = (int) $lang;
202:         $this->_client = (int) $client;
203:         $this->_layout = (bool) $layout;
204:         $this->_save = (bool) $save;
205: 
206:         $this->_oArtLang = new cApiArticleLanguage();
207:         $this->_oArtLang->loadByArticleAndLanguageId($this->_idart, $this->_lang);
208:         if (!$this->_oArtLang->isLoaded()) {
209:             throw new cInvalidArgumentException('Couldn\'t load article language for idart=' . $this->_idart . 'AND idlang=' . $this->_lang);
210:         }
211: 
212:         $this->_idartlang = $this->_oArtLang->get('idartlang');
213:         $this->_pageTitle = stripslashes($this->_oArtLang->get('pagetitle'));
214: 
215:         return $this->_generate($contype, $editable, $version);
216:     }
217: 
218:     /**
219:      * Generates the code for a specific article (article for a client in a
220:      * language).
221:      *
222:      * @param bool $contype [optional]
223:      *         Flag to enable/disable replacement of CMS_TAGS[].
224:      * @param bool $editable [optional]
225:      * @param bool $version [optional]
226:      * @return string
227:      *         The generated code.
228:      */
229:     abstract function _generate($contype = true, $editable = true, $version = NULL);
230: 
231:     /**
232:      * Returns the template configuration id,
233:      * either by configured article or by configured category.
234:      *
235:      * @return int|NULL
236:      */
237:     protected function _getTemplateConfigurationId() {
238:         // get configuration for article
239:         $idtplcfg = conGetTemplateConfigurationIdForArticle($this->_idart, $this->_idcat, $this->_lang, $this->_client);
240:         if (is_numeric($idtplcfg) && $idtplcfg != 0) {
241:             // article is configured
242:             cDebug::out("configuration for article found: $idtplcfg<br><br>");
243:         } else {
244:             // check whether category is configured
245:             $idtplcfg = conGetTemplateConfigurationIdForCategory($this->_idcat, $this->_lang, $this->_client);
246:             if (NULL !== $idtplcfg) {
247:                 // category is configured
248:                 cDebug::out("configuration for category found: $idtplcfg<br><br>");
249:             }
250:         }
251: 
252:         return (is_numeric($idtplcfg)) ? $idtplcfg : NULL;
253:     }
254: 
255:     /**
256:      * Will be invoked, if code generation wasn't able to find a configured
257:      * article or category.
258:      *
259:      * @todo This method is not required as it is only used in the standard code generator.
260:      * @param int $idcatart
261:      *         Category article id
262:      */
263:     abstract protected function _processNoConfigurationError($idcatart);
264: 
265:     /**
266:      * Returns array containing used layout, template and template name.
267:      *
268:      * @global array $cfg
269:      * @return array
270:      *         Asooziative array like
271:      *         array(
272:      *             'idlay' => (int),
273:      *             'idtpl' => (int),
274:      *             'name' => (string)
275:      *         )
276:      */
277:     protected function _getTemplateData() {
278:         global $cfg;
279: 
280:         // Get IDLAY and IDMOD array
281:         $sql = "SELECT
282:                     a.idlay AS idlay
283:                     , a.idtpl AS idtpl
284:                     , a.name AS name
285:                 FROM
286:                     `%s` AS a
287:                     , `%s` AS b
288:                 WHERE
289:                     b.idtplcfg = %d
290:                     AND b.idtpl = a.idtpl
291:                 ;";
292: 
293:         $sql = $this->_db->prepare($sql, $cfg['tab']['tpl'], $cfg['tab']['tpl_conf'], $this->_idtplcfg);
294:         $this->_db->query($sql);
295:         $this->_db->nextRecord();
296:         $data = $this->_db->toArray();
297: 
298:         if ($this->_layout !== false) {
299:             $data['idlay'] = $this->_layout;
300:         }
301: 
302:         cDebug::out("Using Layout: $data[idlay] and Template: $data[idtpl] for generation of code.<br><br>");
303: 
304:         return $data;
305:     }
306: 
307:     /**
308:      * Processes replacements of all existing CMS_* tags within passed code.
309:      *
310:      * @param array $contentList
311:      *         Associative list of CMS variables.
312:      * @param bool $saveKeywords [optional]
313:      *         Flag to save collected keywords during replacement process.
314:      * @param bool $editable [optional]
315:      */
316:     protected function _processCmsTags($contentList, $saveKeywords = true, $editable = true) {
317:         /*
318:          * NOTE: Variables below are required in included/evaluated content type codes!
319:          */
320:         global $db, $db2, $sess, $cfg, $code, $cfgClient, $encoding;
321: 
322:         // NOTE: Variables below are additionally required in included/evaluated
323:         // content type codes within backend edit mode!
324:         global $edit, $editLink, $belang;
325: 
326:         $idcat = $this->_idcat;
327:         $idart = $this->_idart;
328:         $lang = $this->_lang;
329:         $client = $this->_client;
330:         $idartlang = $this->_idartlang;
331: 
332:         if (!is_object($db2)) {
333:             $db2 = cRegistry::getDb();
334:         }
335:         /*
336:          * End: Variables required in content type codes
337:          */
338: 
339:         $match = array();
340:         $keycode = array();
341: 
342:         // NOTE: $a_content is used by included/evaluated content type codes
343:         // below
344:         $a_content = $contentList;
345:         // Select all cms_type entries
346:         $_typeList = array();
347:         $oTypeColl = new cApiTypeCollection();
348:         $oTypeColl->select();
349:         while (false !== ($oType = $oTypeColl->next())) {
350:             $_typeList[] = $oType->toObject();
351:         }
352: 
353:         // Replace all CMS_TAGS[]
354:         foreach ($_typeList as $_typeItem) {
355:             $key = strtolower($_typeItem->type);
356:             $type = $_typeItem->type;
357:             // Try to find all CMS_{type}[{number}] values, e. g. CMS_HTML[1]
358:             // $tmp = preg_match_all('/(' . $type . ')\[+([a-z0-9_]+)+\]/i',
359:             // $this->_layoutCode, $match);
360:             $tmp = preg_match_all('/(' . $type . '\[+(\d)+\])/i', $this->_layoutCode, $match);
361: 
362:             $a_[$key] = $match[0];
363: 
364:             $success = array_walk($a_[$key], 'cString::extractNumber');
365: 
366:             $search = array();
367:             $replacements = array();
368: 
369:             $typeClassName = $this->_getContentTypeClassName($type);
370:             $typeCodeFile = $this->_getContentTypeCodeFilePathName($type);
371: 
372:             foreach ($a_[$key] as $val) {
373:                 if (class_exists($typeClassName)) {
374:                     // We have a class for the content type, use it
375:                     $tmp = $a_content[$_typeItem->type][$val];
376:                     $cTypeObject = new $typeClassName($tmp, $val, $a_content);
377:                     global $edit;
378: 
379:                     if (cRegistry::isBackendEditMode()) {
380:                         //if ($editable) {
381:                             $tmp = $cTypeObject->generateEditCode();
382:                         //} else if ($typeClassName !== 'cContentTypeImgeditor') {
383:                         //    $tmp = $cTypeObject->generateViewCode();
384:                         //}
385:                     } else {
386:                         $tmp = $cTypeObject->generateViewCode();
387:                     }
388:                 } else if (cFileHandler::exists($typeCodeFile)) {
389:                     // Include CMS type code file
390:                     include($typeCodeFile);
391:                 }
392: 
393:                 $search[$val] = sprintf('%s[%s]', $type, $val);
394:                 $replacements[$val] = $tmp;
395:                 $keycode[$type][$val] = $tmp;
396:             }
397:             $this->_layoutCode = str_ireplace($search, $replacements, $this->_layoutCode);
398:         }
399:     }
400: 
401:     /**
402:      * Processes and adds or replaces title tag for an article.
403:      */
404:     abstract protected function _processCodeTitleTag();
405: 
406:     /**
407:      * Processes and adds or replaces all meta tags for an article.
408:      */
409:     abstract protected function _processCodeMetaTags();
410: 
411:     /**
412:      * Replaces all container/module configuration tags (CMS_VALUE[n] values)
413:      * by their settings.
414:      *
415:      * @param int $containerNumber
416:      *         Container number
417:      * @param string $containerCfg
418:      *         A string being formatted like concatenated query
419:      *         parameter, e. g. param1=value1&param2=value2...
420:      * @return string
421:      *         Concatenated PHP code containing CMS_VALUE variables and their values
422:      */
423:     protected function _processCmsValueTags($containerNumber, $containerCfg) {
424:         $containerCfgList = array();
425: 
426:         $containerCfg = preg_replace('/(&\$)/', '', $containerCfg);
427:         parse_str($containerCfg, $containerCfgList);
428: 
429:         // $tmp1 = preg_split('/&/', $containerCfg);
430:         // foreach ($tmp1 as $key1 => $value1) {
431:         //     $tmp2 = explode('=', $value1);
432:         //     foreach ($tmp2 as $key2 => $value2) {
433:         //         $containerCfgList["$tmp2[0]"] = $tmp2[1];
434:         //     }
435:         // }
436: 
437:         $CiCMS_Var = '$C' . $containerNumber . 'CMS_VALUE';
438:         $CiCMS_Values = array();
439: 
440:         foreach ($containerCfgList as $key3 => $value3) {
441:             // convert special characters and escape backslashes!
442:             $tmp = conHtmlSpecialChars($value3);
443:             $tmp = str_replace('\\', '\\\\', $tmp);
444:             $CiCMS_Values[] = $CiCMS_Var . '[' . $key3 . '] = "' . $tmp . '"; ';
445:             $this->_moduleCode = str_replace("\$CMS_VALUE[$key3]", $tmp, $this->_moduleCode);
446:             $this->_moduleCode = str_replace("CMS_VALUE[$key3]", $tmp, $this->_moduleCode);
447:         }
448: 
449:         $this->_moduleCode = str_replace("CMS_VALUE", $CiCMS_Var, $this->_moduleCode);
450:         $this->_moduleCode = str_replace("\$" . $CiCMS_Var, $CiCMS_Var, $this->_moduleCode);
451:         $this->_moduleCode = preg_replace("/(CMS_VALUE\[)([0-9]*)(\])/i", '', $this->_moduleCode);
452: 
453:         return implode("\n", $CiCMS_Values);
454:     }
455: 
456:     /**
457:      * Extends container code by adding several debug features, if enabled and
458:      * configured.
459:      *
460:      * @param int $containerNumber
461:      *         Container number (the id attribute in container tag).
462:      * @param array $module
463:      *         Recordset as assoziative array of related module (container code).
464:      */
465:     protected function _processFrontendDebug($containerNumber, array $module) {
466:         global $containerinf;
467: 
468:         $data = $this->_getTemplateData();
469: 
470:         if (empty($this->_feDebugOptions)) {
471:             return;
472:         }
473: 
474:         $sFeDebug = '';
475:         if ($this->_feDebugOptions['container_display'] == true) {
476:             $this->_modulePrefix[] = 'if ($frontend_debug[\'container_display\']) echo "<!-- START CONTAINER ' . $containerinf[$data['idlay']][$containerNumber]['name'] . ' (' . $containerNumber . ') -->";';
477:         }
478: 
479:         if ($this->_feDebugOptions['module_display'] == true) {
480:             $this->_modulePrefix[] = 'if ($frontend_debug[\'module_display\']) echo "<!-- START MODULE ' . $module['name'] . ' (' . $module['idmod'] . ') -->";';
481:         }
482: 
483:         if ($this->_feDebugOptions['module_timing'] == true) {
484:             $this->_modulePrefix[] = '$modTime' . $containerNumber . ' = -getmicrotime(true);';
485:             $this->_moduleSuffix[] = '$modTime' . $containerNumber . ' += getmicrotime(true);';
486:         }
487: 
488:         if ($this->_feDebugOptions['module_display'] == true) {
489:             $this->_moduleSuffix[] = 'if ($frontend_debug[\'module_display\']) echo "<!-- END MODULE ' . $module['name'] . ' (' . $module['idmod'] . ')";';
490:             if ($this->_feDebugOptions['module_timing'] == true) {
491:                 $this->_moduleSuffix[] = 'if ($frontend_debug[\'module_timing\']) echo(" AFTER " . $modTime' . $containerNumber . ');';
492:             }
493:             $this->_moduleSuffix[] = 'if ($frontend_debug[\'module_display\']) echo " -->";';
494:         }
495:         if ($this->_feDebugOptions['container_display'] == true) {
496:             $this->_moduleSuffix[] = 'if ($frontend_debug[\'container_display\']) echo "<!-- END CONTAINER ' . $containerinf[$data['idlay']][$containerNumber]['name'] . ' (' . $containerNumber . ') -->";';
497:         }
498:     }
499: 
500:     /**
501:      * Replaces container tag in layout by the parsed container code
502:      * (module code).
503:      *
504:      * @param int $containerNumber
505:      *         Container number (the id attribute in container tag).
506:      */
507:     protected function _processCmsContainer($containerNumber) {
508:         $cmsContainer = "CMS_CONTAINER[$containerNumber]";
509: 
510:         // replace new container (<container id="n"..>) against old one
511:         // (CMS_CONTAINER[n])
512:         $this->_layoutCode = preg_replace("/<container( +)id=\\\"$containerNumber\\\"(.*)>(.*)<\/container>/Uis", $cmsContainer, $this->_layoutCode);
513:         $this->_layoutCode = preg_replace("/<container( +)id=\\\"$containerNumber\\\"(.*)\/>/i", $cmsContainer, $this->_layoutCode);
514: 
515:         // concatenate final container/module output code,
516:         // but generate PHP code only if there is something to generate
517:         $modulePrefix = trim(implode("\n", $this->_modulePrefix));
518:         if (!empty($modulePrefix)) {
519:             $modulePrefix = "<?php\n" . $modulePrefix . "\n?>";
520:         }
521:         $moduleSuffix = trim(implode("\n", $this->_moduleSuffix));
522:         if (!empty($moduleSuffix)) {
523:             $moduleSuffix = "<?php\n" . $moduleSuffix . "\n?>";
524:         }
525:         $moduleOutput = $modulePrefix . $this->_moduleCode . $moduleSuffix;
526: 
527:         // replace container (CMS_CONTAINER[n]) against the container code
528:         $this->_layoutCode = str_ireplace($cmsContainer, $moduleOutput, $this->_layoutCode);
529:         // $this->_layoutCode = addslashes($this->_layoutCode);
530:     }
531: 
532:     /**
533:      * Returns array of all CMS_* vars being used by current article and language
534:      *
535:      * @param bool $editable [optional]
536:      * @param int|NULL $version [optional]
537:      * @return array
538:      *         like $arr[type][typeid] = value;
539:      */
540:     protected function _getUsedCmsTypesData($editable = true, $version = NULL) {
541:         global $cfg;
542: 
543:         $return = array();
544: 
545:         // Find out what kind of CMS_... Vars are in use
546:         if ($version == NULL) {
547:             $sql = "SELECT * FROM `%s` AS A, `%s` AS B, `%s` AS C
548:                     WHERE A.idtype = C.idtype AND A.idartlang = B.idartlang AND B.idart = %d AND B.idlang = %d";
549:             $sql = $this->_db->prepare(
550:                     $sql,
551:                     $cfg['tab']['content'],
552:                     $cfg['tab']['art_lang'],
553:                     $cfg['tab']['type'],
554:                     $this->_idart,
555:                     $this->_lang
556:             );
557:         } else if (is_numeric($version)) {
558:             $sql = 'SELECT b.type as type, a.typeid as typeid, a.value as value
559:                     FROM `%s` AS a
560:                     INNER JOIN `%s` as b
561:                             ON b.idtype = a.idtype
562:                     WHERE (a.idtype, a.typeid, a.version) IN
563:                             (SELECT idtype, typeid, max(version)
564:                             FROM %s
565:                             WHERE idartlang = %d AND version <= %d
566:                             GROUP BY idtype, typeid)
567:                     AND a.idartlang = %d
568:                     AND (a.deleted < 1 OR a.deleted IS NULL)
569:                     ORDER BY a.idtype, a.typeid;';
570:             $sql = $this->_db->prepare(
571:                     $sql,
572:                     $cfg['tab']['content_version'],
573:                     $cfg['tab']['type'],
574:                     $cfg['tab']['content_version'],
575:                     $this->_idartlang,
576:                     $version,
577:                     $this->_idartlang
578:             );
579:         }
580: 
581:         $this->_db->query($sql);
582:         while ($this->_db->nextRecord()) {
583:             $return[$this->_db->f('type')][$this->_db->f('typeid')] = $this->_db->f('value');
584:         }
585: 
586:         return $return;
587:     }
588: 
589:     /**
590:      * Resets module related variables.
591:      */
592:     protected function _resetModule() {
593:         $this->_modulePrefix = array();
594:         $this->_moduleCode = '';
595:         $this->_moduleSuffix = array();
596:     }
597: 
598:     /**
599:      * Returns the classname for a content type.
600:      *
601:      * @param string $type
602:      *         Content type, e. g. CMS_HTMLHEAD
603:      * @return string
604:      *         The classname e. g. cContentTypeHtmlhead for content type CMS_HTMLHEAD
605:      */
606:     protected function _getContentTypeClassName($type) {
607:         $typeClassName = 'cContentType' . ucfirst(strtolower(str_replace('CMS_', '', $type)));
608: 
609:         return $typeClassName;
610:     }
611: 
612:     /**
613:      * Returns the full path to the include file name of a content type.
614:      *
615:      * @param string $type
616:      *         Content type, e. g. CMS_HTMLHEAD
617:      * @return string
618:      *         The full path e. g.
619:      *         {path_to_contenido_includes}/type/code/include.CMS_HTMLHEAD.code.php
620:      *         for content type CMS_HTMLHEAD
621:      */
622:     protected function _getContentTypeCodeFilePathName($type) {
623:         global $cfg;
624:         $typeCodeFile = cRegistry::getBackendPath() . $cfg['path']['includes'] . 'type/code/include.' . $type . '.code.php';
625: 
626:         return $typeCodeFile;
627:     }
628: 
629:     /**
630:      * Getter for article language.
631:      *
632:      * @todo deprecate me
633:      * @return cApiArticleLanguage
634:      *         the artlang object
635:      */
636:     protected function getArtLangObject() {
637:         return $this->_oArtLang;
638:     }
639: }
640: 
CMS CONTENIDO 4.9.8 API documentation generated by ApiGen 2.8.0