Overview

Packages

  • Auth
    • Ads
    • Ldap
    • Xoops
  • Autotasks
  • Config
    • Category
    • Item
    • Option
  • Core
    • Filesystem
    • Filters
    • Logger
    • Mail
    • Message
    • Password
    • Security
    • StopSpammer
    • Template
    • Textsanitizer
    • VersionChecker
  • Data
    • Avatar
    • Comment
  • Database
    • Connection
    • Criteria
    • Legacy
    • MySQL
    • PDO
    • Updater
  • Feeds
    • RSS
  • File
  • Form
    • Base
    • Elements
  • ICMS
    • IPF
      • View
  • Image
    • Category
  • Ipf
    • Category
    • Controller
    • Export
    • form
    • Keyhighlighter
    • Member
    • Object
    • Permission
    • richfile
    • Tree
    • urllink
    • View
  • kernel
    • Set
  • Member
    • Group
    • GroupMembership
    • GroupPermission
    • User
  • Messaging
  • Module
  • None
  • Notification
  • Page
  • Plugins
    • Editor
  • Preload
    • Libraries
  • Privmessage
  • Session
  • SmartObject
  • View
    • Block
    • Breadcrumb
    • PageNav
    • PrinterFriendly
    • Template
    • Templates
    • Theme
    • Tree

Classes

  • icms_auth_Ads
  • icms_auth_Factory
  • icms_auth_Ldap
  • icms_auth_Object
  • icms_auth_Provisionning
  • icms_auth_Xoops
  • icms_Autoloader
  • icms_config_category_Handler
  • icms_config_category_Object
  • icms_config_Handler
  • icms_config_Item_Handler
  • icms_config_Item_Object
  • icms_config_option_Handler
  • icms_config_option_Object
  • icms_core_DataFilter
  • icms_core_Debug
  • icms_core_Filesystem
  • icms_core_HTMLFilter
  • icms_core_Logger
  • icms_core_Message
  • icms_core_Object
  • icms_core_ObjectHandler
  • icms_core_OnlineHandler
  • icms_core_Password
  • icms_core_Security
  • icms_core_Session
  • icms_core_StopSpammer
  • icms_core_Textsanitizer
  • icms_core_Versionchecker
  • icms_data_avatar_Handler
  • icms_data_avatar_Object
  • icms_data_comment_Handler
  • icms_data_comment_Object
  • icms_data_comment_Renderer
  • icms_data_file_Handler
  • icms_data_file_Object
  • icms_data_notification_Handler
  • icms_data_notification_Object
  • icms_data_page_Handler
  • icms_data_page_Object
  • icms_data_privmessage_Handler
  • icms_data_privmessage_Object
  • icms_data_urllink_Handler
  • icms_data_urllink_Object
  • icms_db_Connection
  • icms_db_criteria_Compo
  • icms_db_criteria_Element
  • icms_db_criteria_Item
  • icms_db_Factory
  • icms_db_legacy_Database
  • icms_db_legacy_Factory
  • icms_db_legacy_mysql_Database
  • icms_db_legacy_mysql_Proxy
  • icms_db_legacy_mysql_Safe
  • icms_db_legacy_mysql_Utility
  • icms_db_legacy_PdoDatabase
  • icms_db_legacy_updater_Handler
  • icms_db_legacy_updater_Table
  • icms_db_mysql_Connection
  • icms_db_mysql_Utility
  • icms_Event
  • icms_feeds_Rss
  • icms_feeds_Simplerss
  • icms_file_DownloadHandler
  • icms_file_MediaUploadHandler
  • icms_file_TarDownloader
  • icms_file_TarFileHandler
  • icms_file_ZipDownloader
  • icms_file_ZipFileHandler
  • icms_form_Base
  • icms_form_Element
  • icms_form_elements_Button
  • icms_form_elements_Captcha
  • icms_form_elements_captcha_Image
  • icms_form_elements_captcha_ImageHandler
  • icms_form_elements_captcha_Object
  • icms_form_elements_captcha_Text
  • icms_form_elements_Checkbox
  • icms_form_elements_Colorpicker
  • icms_form_elements_Date
  • icms_form_elements_Datetime
  • icms_form_elements_Dhtmltextarea
  • icms_form_elements_Editor
  • icms_form_elements_File
  • icms_form_elements_Groupperm
  • icms_form_elements_Hidden
  • icms_form_elements_Hiddentoken
  • icms_form_elements_Label
  • icms_form_elements_Password
  • icms_form_elements_Radio
  • icms_form_elements_Radioyn
  • icms_form_elements_Select
  • icms_form_elements_select_Country
  • icms_form_elements_select_Editor
  • icms_form_elements_select_Group
  • icms_form_elements_select_Image
  • icms_form_elements_select_Lang
  • icms_form_elements_select_Matchoption
  • icms_form_elements_select_Theme
  • icms_form_elements_select_Timezone
  • icms_form_elements_select_User
  • icms_form_elements_Text
  • icms_form_elements_Textarea
  • icms_form_elements_Tray
  • icms_form_Groupperm
  • icms_form_Simple
  • icms_form_Table
  • icms_form_Theme
  • icms_image_category_Handler
  • icms_image_category_Object
  • icms_image_Handler
  • icms_image_Object
  • icms_image_set_Handler
  • icms_image_set_Object
  • icms_ipf_About
  • icms_ipf_category_Handler
  • icms_ipf_category_Object
  • icms_ipf_Controller
  • icms_ipf_export_Handler
  • icms_ipf_export_Renderer
  • icms_ipf_form_Base
  • icms_ipf_form_elements_Autocomplete
  • icms_ipf_form_elements_Blockoptions
  • icms_ipf_form_elements_Checkbox
  • icms_ipf_form_elements_Date
  • icms_ipf_form_elements_Datetime
  • icms_ipf_form_elements_File
  • icms_ipf_form_elements_Fileupload
  • icms_ipf_form_elements_Image
  • icms_ipf_form_elements_Imageupload
  • icms_ipf_form_elements_Language
  • icms_ipf_form_elements_Page
  • icms_ipf_form_elements_Parentcategory
  • icms_ipf_form_elements_Passwordtray
  • icms_ipf_form_elements_Radio
  • icms_ipf_form_elements_Richfile
  • icms_ipf_form_elements_Section
  • icms_ipf_form_elements_Select
  • icms_ipf_form_elements_Selectmulti
  • icms_ipf_form_elements_Signature
  • icms_ipf_form_elements_Source
  • icms_ipf_form_elements_Text
  • icms_ipf_form_elements_Time
  • icms_ipf_form_elements_Upload
  • icms_ipf_form_elements_Urllink
  • icms_ipf_form_elements_User
  • icms_ipf_form_elements_Yesno
  • icms_ipf_form_Secure
  • icms_ipf_Handler
  • icms_ipf_Highlighter
  • icms_ipf_member_Handler
  • icms_ipf_Metagen
  • icms_ipf_Object
  • icms_ipf_permission_Handler
  • icms_ipf_registry_Handler
  • icms_ipf_seo_Object
  • icms_ipf_Tree
  • icms_ipf_view_Column
  • icms_ipf_view_Row
  • icms_ipf_view_Single
  • icms_ipf_view_Table
  • icms_ipf_view_Tree
  • icms_member_group_Handler
  • icms_member_group_membership_Handler
  • icms_member_group_membership_Object
  • icms_member_group_Object
  • icms_member_groupperm_Handler
  • icms_member_groupperm_Object
  • icms_member_Handler
  • icms_member_user_Handler
  • icms_member_user_Object
  • icms_messaging_EmailHandler
  • icms_messaging_Handler
  • icms_module_Handler
  • icms_module_Object
  • icms_plugins_EditorHandler
  • icms_plugins_Handler
  • icms_plugins_Object
  • icms_preload_Handler
  • icms_preload_Item
  • icms_preload_LibrariesHandler
  • icms_sys_autotasks_System
  • icms_Utils
  • icms_view_block_Handler
  • icms_view_block_Object
  • icms_view_block_position_Handler
  • icms_view_block_position_Object
  • icms_view_Breadcrumb
  • icms_view_PageBuilder
  • icms_view_PageNav
  • icms_view_Printerfriendly
  • icms_view_template_file_Handler
  • icms_view_template_file_Object
  • icms_view_template_set_Handler
  • icms_view_template_set_Object
  • icms_view_theme_Factory
  • icms_view_theme_Object
  • icms_view_Tpl
  • icms_view_Tree

Interfaces

  • icms_db_IConnection
  • icms_db_IUtility
  • icms_db_legacy_IDatabase
  • icms_sys_autotasks_ISystem
  • Overview
  • Package
  • Class
   1:    2:    3:    4:    5:    6:    7:    8:    9:   10:   11:   12:   13:   14:   15:   16:   17:   18:   19:   20:   21:   22:   23:   24:   25:   26:   27:   28:   29:   30:   31:   32:   33:   34:   35:   36:   37:   38:   39:   40:   41:   42:   43:   44:   45:   46:   47:   48:   49:   50:   51:   52:   53:   54:   55:   56:   57:   58:   59:   60:   61:   62:   63:   64:   65:   66:   67:   68:   69:   70:   71:   72:   73:   74:   75:   76:   77:   78:   79:   80:   81:   82:   83:   84:   85:   86:   87:   88:   89:   90:   91:   92:   93:   94:   95:   96:   97:   98:   99:  100:  101:  102:  103:  104:  105:  106:  107:  108:  109:  110:  111:  112:  113:  114:  115:  116:  117:  118:  119:  120:  121:  122:  123:  124:  125:  126:  127:  128:  129:  130:  131:  132:  133:  134:  135:  136:  137:  138:  139:  140:  141:  142:  143:  144:  145:  146:  147:  148:  149:  150:  151:  152:  153:  154:  155:  156:  157:  158:  159:  160:  161:  162:  163:  164:  165:  166:  167:  168:  169:  170:  171:  172:  173:  174:  175:  176:  177:  178:  179:  180:  181:  182:  183:  184:  185:  186:  187:  188:  189:  190:  191:  192:  193:  194:  195:  196:  197:  198:  199:  200:  201:  202:  203:  204:  205:  206:  207:  208:  209:  210:  211:  212:  213:  214:  215:  216:  217:  218:  219:  220:  221:  222:  223:  224:  225:  226:  227:  228:  229:  230:  231:  232:  233:  234:  235:  236:  237:  238:  239:  240:  241:  242:  243:  244:  245:  246:  247:  248:  249:  250:  251:  252:  253:  254:  255:  256:  257:  258:  259:  260:  261:  262:  263:  264:  265:  266:  267:  268:  269:  270:  271:  272:  273:  274:  275:  276:  277:  278:  279:  280:  281:  282:  283:  284:  285:  286:  287:  288:  289:  290:  291:  292:  293:  294:  295:  296:  297:  298:  299:  300:  301:  302:  303:  304:  305:  306:  307:  308:  309:  310:  311:  312:  313:  314:  315:  316:  317:  318:  319:  320:  321:  322:  323:  324:  325:  326:  327:  328:  329:  330:  331:  332:  333:  334:  335:  336:  337:  338:  339:  340:  341:  342:  343:  344:  345:  346:  347:  348:  349:  350:  351:  352:  353:  354:  355:  356:  357:  358:  359:  360:  361:  362:  363:  364:  365:  366:  367:  368:  369:  370:  371:  372:  373:  374:  375:  376:  377:  378:  379:  380:  381:  382:  383:  384:  385:  386:  387:  388:  389:  390:  391:  392:  393:  394:  395:  396:  397:  398:  399:  400:  401:  402:  403:  404:  405:  406:  407:  408:  409:  410:  411:  412:  413:  414:  415:  416:  417:  418:  419:  420:  421:  422:  423:  424:  425:  426:  427:  428:  429:  430:  431:  432:  433:  434:  435:  436:  437:  438:  439:  440:  441:  442:  443:  444:  445:  446:  447:  448:  449:  450:  451:  452:  453:  454:  455:  456:  457:  458:  459:  460:  461:  462:  463:  464:  465:  466:  467:  468:  469:  470:  471:  472:  473:  474:  475:  476:  477:  478:  479:  480:  481:  482:  483:  484:  485:  486:  487:  488:  489:  490:  491:  492:  493:  494:  495:  496:  497:  498:  499:  500:  501:  502:  503:  504:  505:  506:  507:  508:  509:  510:  511:  512:  513:  514:  515:  516:  517:  518:  519:  520:  521:  522:  523:  524:  525:  526:  527:  528:  529:  530:  531:  532:  533:  534:  535:  536:  537:  538:  539:  540:  541:  542:  543:  544:  545:  546:  547:  548:  549:  550:  551:  552:  553:  554:  555:  556:  557:  558:  559:  560:  561:  562:  563:  564:  565:  566:  567:  568:  569:  570:  571:  572:  573:  574:  575:  576:  577:  578:  579:  580:  581:  582:  583:  584:  585:  586:  587:  588:  589:  590:  591:  592:  593:  594:  595:  596:  597:  598:  599:  600:  601:  602:  603:  604:  605:  606:  607:  608:  609:  610:  611:  612:  613:  614:  615:  616:  617:  618:  619:  620:  621:  622:  623:  624:  625:  626:  627:  628:  629:  630:  631:  632:  633:  634:  635:  636:  637:  638:  639:  640:  641:  642:  643:  644:  645:  646:  647:  648:  649:  650:  651:  652:  653:  654:  655:  656:  657:  658:  659:  660:  661:  662:  663:  664:  665:  666:  667:  668:  669:  670:  671:  672:  673:  674:  675:  676:  677:  678:  679:  680:  681:  682:  683:  684:  685:  686:  687:  688:  689:  690:  691:  692:  693:  694:  695:  696:  697:  698:  699:  700:  701:  702:  703:  704:  705:  706:  707:  708:  709:  710:  711:  712:  713:  714:  715:  716:  717:  718:  719:  720:  721:  722:  723:  724:  725:  726:  727:  728:  729:  730:  731:  732:  733:  734:  735:  736:  737:  738:  739:  740:  741:  742:  743:  744:  745:  746:  747:  748:  749:  750:  751:  752:  753:  754:  755:  756:  757:  758:  759:  760:  761:  762:  763:  764:  765:  766:  767:  768:  769:  770:  771:  772:  773:  774:  775:  776:  777:  778:  779:  780:  781:  782:  783:  784:  785:  786:  787:  788:  789:  790:  791:  792:  793:  794:  795:  796:  797:  798:  799:  800:  801:  802:  803:  804:  805:  806:  807:  808:  809:  810:  811:  812:  813:  814:  815:  816:  817:  818:  819:  820:  821:  822:  823:  824:  825:  826:  827:  828:  829:  830:  831:  832:  833:  834:  835:  836:  837:  838:  839:  840:  841:  842:  843:  844:  845:  846:  847:  848:  849:  850:  851:  852:  853:  854:  855:  856:  857:  858:  859:  860:  861:  862:  863:  864:  865:  866:  867:  868:  869:  870:  871:  872:  873:  874:  875:  876:  877:  878:  879:  880:  881:  882:  883:  884:  885:  886:  887:  888:  889:  890:  891:  892:  893:  894:  895:  896:  897:  898:  899:  900:  901:  902:  903:  904:  905:  906:  907:  908:  909:  910:  911:  912:  913:  914:  915:  916:  917:  918:  919:  920:  921:  922:  923:  924:  925:  926:  927:  928:  929:  930:  931:  932:  933:  934:  935:  936:  937:  938:  939:  940:  941:  942:  943:  944:  945:  946:  947:  948:  949:  950:  951:  952:  953:  954:  955:  956:  957:  958:  959:  960:  961:  962:  963:  964:  965:  966:  967:  968:  969:  970:  971:  972:  973:  974:  975:  976:  977:  978:  979:  980:  981:  982:  983:  984:  985:  986:  987:  988:  989:  990:  991:  992:  993:  994:  995:  996:  997:  998:  999: 1000: 1001: 1002: 1003: 1004: 1005: 1006: 1007: 1008: 1009: 1010: 1011: 1012: 1013: 1014: 1015: 1016: 1017: 1018: 1019: 1020: 1021: 1022: 1023: 1024: 1025: 1026: 1027: 1028: 1029: 1030: 1031: 1032: 1033: 1034: 1035: 1036: 1037: 1038: 1039: 1040: 1041: 1042: 1043: 1044: 1045: 1046: 1047: 1048: 1049: 1050: 1051: 1052: 
<?php
/**
 * icms_ipf_Handler
 *
 * This class is responsible for providing data access mechanisms to the data source
 * of derived class objects as well as some basic operations inherant to objects manipulation
 *
 * @copyright   The ImpressCMS Project http://www.impresscms.org/
 * @license     http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU General Public License (GPL)
 * @category    ICMS
 * @package     Ipf
 * @since       1.1
 * @author      marcan <marcan@impresscms.org>
 * @author      This was inspired by Mithrandir PersistableObjectHanlder: Jan Keller Pedersen <mithrandir@xoops.org> - IDG Danmark A/S <www.idg.dk>
 * @author      Gustavo Alejandro Pilla (aka nekro) <nekro@impresscms.org> <gpilla@nubee.com.ar>
 * @version     SVN: $Id: Handler.php 12068 2012-10-14 21:28:13Z skenow $
 * @todo        Use language constants for messages
 * @todo        Properly determine visibility for methods and vars (private, protected, public) and apply naming conventions
 */

defined("ICMS_ROOT_PATH") or die("ImpressCMS root path not defined");
/**
 * Persistable Object Handlder
 * @category    ICMS
 * @package     Ipf
 * @since       1.1
 * @todo        Properly name the vars using the naming conventions
 */
class icms_ipf_Handler extends icms_core_ObjectHandler {

    /**
     *
     * The name of the IPF object
     * @var string
     * @todo    Rename using the proper naming convention (this is a public var)
     */
    public $_itemname;

    /**
     * Name of the table use to store this {@link icms_ipf_Object}
     *
     * Note that the name of the table needs to be free of the database prefix.
     * For example "smartsection_categories"
     * @var string
     */
    public $table;

    /**
     * Name of the table key that uniquely identify each {@link icms_ipf_Object}
     *
     * For example : "categoryid"
     * @var string
     */
    public $keyName;

    /**
     * Name of the class derived from {@link icms_ipf_Object} and which this handler is handling
     *
     * Note that this string needs to be lowercase
     *
     * For example : "smartsectioncategory"
     * @var string
     */
    public $className;

    /**
     * Name of the field which properly identify the {@link icms_ipf_Object}
     *
     * For example : "name" (this will be the category's name)
     * @var string
     */
    public $identifierName;

    /**
     * Name of the field which will be use as a summary for the object
     *
     * For example : "summary"
     * @var string
     */
    public $summaryName;

    /**
     * Page name use to basically manage and display the {@link icms_ipf_Object}
     *
     * This page needs to be the same in user side and admin side
     *
     * For example category.php - we will deduct smartsection/category.php as well as smartsection/admin/category.php
     * @todo this could probably be automatically deducted from the class name - for example, the class SmartsectionCategory will have "category.php" as it's managing page
     * @todo    Rename using the proper naming convention - this is a public var
     *
     * @var string
     */
    public $_page;

    /**
     * Full path of the module using this {@link icms_ipf_Object}
     *
     * <code>ICMS_URL . "/modules/smartsection/"</code>
     * @todo this could probably be automatically deducted from the class name as it is always prefixed with the module name
     * @var string
     */
    public $_modulePath;

    public $_moduleUrl;

    /**
     *
     * The name of the module for the object
     * @var string
     * @todo    Rename using the proper naming convention (This is a public var)
     */
    public $_moduleName;

    public $uploadEnabled = false;

    public $_uploadUrl;

    public $_uploadPath;

    public $_allowedMimeTypes = 0;

    public $_maxFileSize = 1000000;

    public $_maxWidth = 500;

    public $_maxHeight = 500;

    public $highlightFields = array();

    /**
     * Array containing the events name and functions
     *
     * @var array
     */
    public $eventArray = array();

    /**
     * Array containing the permissions that this handler will manage on the objects
     *
     * @var array
     */
    public $permissionsArray = false;

    public $generalSQL = false;

    public $_eventHooks = array();
    public $_disabledEvents = array();

    /**
     * Constructor - called from child classes
     *
     * @param object $db Database object {@link XoopsDatabase}
     * @param string $itemname Object to be managed
     * @param string $keyname Name of the table key that uniquely identify each {@link icms_ipf_Object}
     * @param string $idenfierName Name of the field which properly identify the {@link icms_ipf_Object}
     * @param string $summaryName Name of the field which will be use as a summary for the object
     * @param string $modulename Directory name of the module controlling this object
     * @return object
     */
    public function __construct(&$db, $itemname, $keyname, $idenfierName, $summaryName, $modulename) {

        parent::__construct($db);

        $this->_itemname = $itemname;
        // Todo: Autodect module
        if ($modulename == '') {
            $this->_moduleName = 'system';
            $this->table = $db->prefix($itemname);
        } else {
            $this->_moduleName = $modulename;
            $this->table = $db->prefix($modulename . "_" . $itemname);
        }
        $this->keyName = $keyname;

        if ($modulename == 'icms')
            $classname = $modulename . '_' . $itemname . '_Object';
        else
            $classname = 'mod_' . $modulename . '_' . ucfirst($itemname);

        /**
         * @todo this could probably be removed after refactopring is completed
         * to be evaluated...
         */
        if (!class_exists($classname))
            $classname = ucfirst($modulename) . ucfirst($itemname);

        $this->className = $classname;
        $this->identifierName = $idenfierName;
        $this->summaryName = $summaryName;
        $this->_page = $itemname . ".php";
        $this->_modulePath = ICMS_ROOT_PATH . "/modules/" . $this->_moduleName . "/";
        $this->_moduleUrl = ICMS_URL . "/modules/" . $this->_moduleName . "/";
        $this->_uploadPath = ICMS_UPLOAD_PATH . "/" . $this->_moduleName . "/";
        $this->_uploadUrl = ICMS_UPLOAD_URL . "/" . $this->_moduleName . "/";
    }

    /**
     *
     * @param str $event
     * @param str $method
     */
    public function addEventHook($event, $method) {
        $this->_eventHooks[$event] = $method;
    }

    /**
     * Add a permission that this handler will manage for its objects
     *
     * Example : $this->addPermission('view', _AM_SSHOP_CAT_PERM_READ, _AM_SSHOP_CAT_PERM_READ_DSC);
     *
     * @param string $perm_name name of the permission
     * @param string $caption caption of the control that will be displayed in the form
     * @param string $description description of the control that will be displayed in the form
     */
    public function addPermission($perm_name, $caption, $description = false) {
        $this->permissionsArray[] = array(
            'perm_name' => $perm_name,
            'caption' => $caption,
            'description' => $description
        );
    }

    /**
     *
     * @param obj $criteria
     * @param str $perm_name
     */
    public function setGrantedObjectsCriteria(&$criteria, $perm_name) {
        $icmspermissions_handler = new icms_ipf_permission_Handler($this);
        $grantedItems = $icmspermissions_handler->getGrantedItems($perm_name);
        if (count($grantedItems) > 0) {
            $criteria->add(new icms_db_criteria_Item($this->keyName, '(' . implode(', ', $grantedItems) . ')', 'IN'));
            return true;
        } else {
            return false;
        }
    }

    /**
     * create a new {@link icms_ipf_Object}
     *
     * @param bool $isNew Flag the new objects as "new"?
     *
     * @return object {@link icms_ipf_Object}
     */
    public function &create($isNew = true) {
        $obj = new $this->className($this);
        if (!$obj->handler) {
            $obj->handler =& $this;
        }

        if ($isNew === true) {
            $obj->setNew();
        }

        if ($this->uploadEnabled)
        $obj->setImageDir($this->getImageUrl(), $this->getImagePath());

        return $obj;
    }

    /**
     *
     */
    public function getImageUrl() {
        return $this->_uploadUrl . $this->_itemname . "/";
    }

    /**
     *
     */
    public function getImagePath() {
        $dir = $this->_uploadPath . $this->_itemname;
        if (!file_exists($dir)) {
            icms_core_Filesystem::mkdir($dir);
        }
        return $dir . "/";
    }

    /**
     * retrieve a {@link icms_ipf_Object}
     *
     * @param mixed $id ID of the object - or array of ids for joint keys. Joint keys MUST be given in the same order as in the constructor
     * @param bool $as_object whether to return an object or an array
     * @return mixed reference to the {@link icms_ipf_Object}, FALSE if failed
     */
    public function &get($id, $as_object = true, $debug = false, $criteria = false) {
        if (!$criteria) {
            $criteria = new icms_db_criteria_Compo();
        }
        if (is_array($this->keyName)) {
            foreach ($this->keyName as $i => $keyName) {
                /**
                 * In some situations, the $id is not an INTEGER. icms_ipf_ObjectTag is an example.
                 * Is the fact that we removed the intval() represents a security risk ?
                 */
                //$criteria->add(new icms_db_criteria_Item($this->keyName[$i], ($id[$i]), '=', $this->_itemname));
                $criteria->add(new icms_db_criteria_Item($keyName, $id[$i], '=', $this->_itemname));
            }
        } else {
            //$criteria = new icms_db_criteria_Item($this->keyName, intval($id), '=', $this->_itemname);
            /**
             * In some situations, the $id is not an INTEGER. icms_ipf_ObjectTag is an example.
             * Is the fact that we removed the intval() represents a security risk ?
             */
            $criteria->add(new icms_db_criteria_Item($this->keyName, $id, '=', $this->_itemname));
        }
        $criteria->setLimit(1);
        if ($debug) {
            $obj_array = $this->getObjectsD($criteria, false, $as_object);
        } else {
            $obj_array = $this->getObjects($criteria, false, $as_object);
            //patch : weird bug of indexing by id even if id_as_key = false;
            if (count($obj_array) && !isset($obj_array[0]) && is_object($obj_array[$id])) {
                $obj_array[0] = $obj_array[$id];
                unset($obj_array[$id]);
                $obj_array[0]->unsetNew();
            }
        }

        if (count($obj_array) != 1) {
            $obj = $this->create();
            return $obj;
        }

        return $obj_array[0];
    }

    /**
     * retrieve a {@link icms_ipf_Object}
     *
     * @param mixed $id ID of the object - or array of ids for joint keys. Joint keys MUST be given in the same order as in the constructor
     * @param bool $as_object whether to return an object or an array
     * @return mixed reference to the {@link icms_ipf_Object}, FALSE if failed
     */
    public function &getD($id, $as_object = true) {
        return $this->get($id, $as_object, true);
    }

    /**
     * retrieve objects from the database
     *
     * @param object $criteria {@link icms_db_criteria_Element} conditions to be met
     * @param bool $id_as_key use the ID as key for the array?
     * @param bool $as_object return an array of objects?
     *
     * @return array
     */
    public function getObjects($criteria = null, $id_as_key = false, $as_object = true, $sql = false, $debug = false) {
        $ret = array();
        $limit = $start = 0;

        if ($this->generalSQL) {
            $sql = $this->generalSQL;
        } elseif (!$sql) {
            $sql = 'SELECT * FROM ' . $this->table . " AS " . $this->_itemname;
        }

        if (isset($criteria) && is_subclass_of($criteria, 'icms_db_criteria_Element')) {
            $sql .= ' ' . $criteria->renderWhere();
            if ($criteria->getSort() != '') {
                $sql .= ' ORDER BY ' . $criteria->getSort() . ' ' . $criteria->getOrder();
            }
            $limit = $criteria->getLimit();
            $start = $criteria->getStart();
        }
        if ($debug) {
            icms_core_Debug::message($sql);
        }

        $result = $this->db->query($sql, $limit, $start);
        if (!$result) {
            return $ret;
        }
        return $this->convertResultSet($result, $id_as_key, $as_object);
    }

    /**
     * query the database with the constructed $criteria object
     *
     * @param string $sql The SQL Query
     * @param object $criteria {@link icms_db_criteria_Element} conditions to be met
     * @param bool $force Force the query?
     * @param bool $debug Turn Debug on?
     *
     * @return array
     */
    public function query($sql, $criteria, $force = false, $debug = false) {
        $ret = array();

        if (isset($criteria) && is_subclass_of($criteria, 'icms_db_criteria_Element')) {
            $sql .= ' ' . $criteria->renderWhere();
            if ($criteria->groupby) {
                $sql .= $criteria->getGroupby();
            }
            if ($criteria->getSort() != '') {
                $sql .= ' ORDER BY ' . $criteria->getSort() . ' ' . $criteria->getOrder();
            }

        }
        if ($debug) {
            icms_core_Debug::message($sql);
        }

        if ($force) {
            $result = $this->db->queryF($sql);
        } else {
            $result = $this->db->query($sql);
        }

        if (!$result) {
            return $ret;
        }

        while ($myrow = $this->db->fetchArray($result)) {
            $ret[] = $myrow;
        }

        return $ret;
    }

    /**
     * retrieve objects with debug mode - so will show the query
     *
     * @param object $criteria {@link icms_db_criteria_Element} conditions to be met
     * @param bool $id_as_key use the ID as key for the array?
     * @param bool $as_object return an array of objects?
     *
     * @return array
     */
    public function getObjectsD($criteria = null, $id_as_key = false, $as_object = true, $sql = false) {
        return $this->getObjects($criteria, $id_as_key, $as_object, $sql, true);
    }

    /**
     *
     * @param arr $arrayObjects
     */
    public function getObjectsAsArray($arrayObjects) {
        $ret = array();
        foreach ($arrayObjects as $key => $object) {
            $ret[$key] = $object->toArray();
        }
        if (count($ret > 0)) {
            return $ret;
        } else {
            return false;
        }
    }

    /**
     * Convert a database resultset to a returnable array
     *
     * @param object $result database resultset
     * @param bool $id_as_key - should NOT be used with joint keys
     * @param bool $as_object
     *
     * @return array
     */
    public function convertResultSet($result, $id_as_key = false, $as_object = true) {
        $ret = array();
        while ($myrow = $this->db->fetchArray($result)) {

            $obj =& $this->create(false);
            $obj->assignVars($myrow);
            if (!$id_as_key) {
                if ($as_object) {
                    $ret[] =& $obj;
                }
                else {
                    $ret[] = $obj->toArray();
                }
            } else {
                if ($as_object) {
                    $value =& $obj;
                }
                else {
                    $value = $obj->toArray();
                }
                if ($id_as_key === 'parentid') {
                    $ret[$obj->getVar($obj->handler->parentName, 'e')][$obj->getVar($this->keyName)] =& $value;
                } else {
                    $ret[$obj->getVar($this->keyName)] = $value;
                }
            }
            unset($obj);
        }

        return $ret;
    }
    /**
     *
     * @param object    $criteria
     * @param int       $limit
     * @param int       $start
     * @return array
     */
    public function getListD($criteria = null, $limit = 0, $start = 0) {
        return $this->getList($criteria, $limit, $start, true);
    }

    /**
     * Retrieve a list of objects as arrays - DON'T USE WITH JOINT KEYS
     *
     * @param object $criteria {@link icms_db_criteria_Element} conditions to be met
     * @param int   $limit      Max number of objects to fetch
     * @param int   $start      Which record to start at
     *
     * @return array
     */
    public function getList($criteria = null, $limit = 0, $start = 0, $debug = false) {
        $ret = array();
        if ($criteria == null) {
            $criteria = new icms_db_criteria_Compo();
        }

        if ($criteria->getSort() == '') {
            $criteria->setSort($this->getIdentifierName());
        }

        $sql = 'SELECT ' . (is_array($this->keyName) ? implode(', ', $this->keyName) : $this->keyName) ;
        if (!empty($this->identifierName)) {
            $sql .= ', ' . $this->getIdentifierName();
        }
        $sql .= ' FROM '.$this->table . " AS " . $this->_itemname;
        if (isset($criteria) && is_subclass_of($criteria, 'icms_db_criteria_Element')) {
            $sql .= ' ' . $criteria->renderWhere();
            if ($criteria->getSort() != '') {
                $sql .= ' ORDER BY ' . $criteria->getSort() . ' ' . $criteria->getOrder();
            }
            $limit = $criteria->getLimit();
            $start = $criteria->getStart();
        }

        if ($debug) {
            icms_core_Debug::message($sql);
        }

        $result = $this->db->query($sql, $limit, $start);
        if (!$result) {
            return $ret;
        }

        while ($myrow = $this->db->fetchArray($result)) {
            //identifiers should be textboxes, so sanitize them like that
            $ret[$myrow[$this->keyName]] = empty($this->identifierName) ? 1
                : icms_core_DataFilter::checkVar($myrow[$this->identifierName], 'text', 'output');
        }
        return $ret;
    }

    /**
     * count objects matching a condition
     *
     * @param object $criteria {@link icms_db_criteria_Element} to match
     * @return int count of objects
     */
    public function getCount($criteria = null) {
        $field = "";
        $groupby = false;
        if (isset($criteria) && is_subclass_of($criteria, 'icms_db_criteria_Element')) {
            if ($criteria->groupby != "") {
                $groupby = true;
                $field = $criteria->groupby . ", "; //Not entirely secure unless you KNOW that no criteria's groupby clause is going to be mis-used
            }
        }
        /**
         * if we have a generalSQL, lets used this one.
         * This needs to be improved...
         */
        if ($this->generalSQL) {
            $sql = $this->generalSQL;
            $sql = str_replace('SELECT *', 'SELECT COUNT(*)', $sql);
        } else {
            $sql = 'SELECT ' . $field . 'COUNT(*) FROM ' . $this->table . ' AS ' . $this->_itemname;
        }
        if (isset($criteria) && is_subclass_of($criteria, 'icms_db_criteria_Element')) {
            $sql .= ' ' . $criteria->renderWhere();
            if ($criteria->groupby != "") {
                $sql .= $criteria->getGroupby();
            }
        }

        $result = $this->db->query($sql);
        if (!$result) {
            return 0;
        }
        if ($groupby == false) {
            list($count) = $this->db->fetchRow($result);
            return $count;
        } else {
            $ret = array();
            while (list($id, $count) = $this->db->fetchRow($result)) {
                $ret[$id] = $count;
            }
            return $ret;
        }
    }

    /**
     * delete an object from the database
     *
     * @param object $obj reference to the object to delete
     * @param bool $force
     * @return bool FALSE if failed.
     */
    public function delete(&$obj, $force = false) {
        $eventResult = $this->executeEvent('beforeDelete', $obj);
        if (!$eventResult) {
            $obj->setErrors("An error occured during the BeforeDelete event");
            return false;
        }

        if (is_array($this->keyName)) {
            $clause = array();
            for ($i = 0; $i < count($this->keyName); $i++) {
                $clause[] = $this->keyName[$i] . ' = ' . $obj->getVar($this->keyName[$i]);
            }
            $whereclause = implode(" AND ", $clause);
        } else {
            $whereclause = $this->keyName . ' = ' . $obj->getVar($this->keyName);
        }
        $sql = 'DELETE FROM ' . $this->table . ' WHERE ' . $whereclause;
        if (false != $force) {
            $result = $this->db->queryF($sql);
        } else {
            $result = $this->db->query($sql);
        }
        if (!$result) {
            return false;
        }

        foreach ($obj->vars as $key => $var) {
            if ($var["data_type"] == XOBJ_DTYPE_URLLINK) {
                $urllinkObj = $obj->getUrlLinkObj($key);
                $urllinkObj->delete($force);
                unset($urllinkObj);
            }
            if ($var["data_type"] == XOBJ_DTYPE_FILE) {
                $fileObj = $obj->getFileObj($key);
                $fileObj->delete($force);
                unset($fileObj);
            }
        }

        $this->deleteGrantedPermissions($obj);

        $eventResult = $this->executeEvent('afterDelete', $obj);
        if (!$eventResult) {
            $obj->setErrors("An error occured during the AfterDelete event");
            return false;
        }
        return true;
    }

    /**
     * delete granted permssions for an object
     *
     * @param   object  $obj    optional
     * @return  bool    TRUE
     */
    private function deleteGrantedPermissions($obj = NULL) {
        $gperm_handler = icms::handler("icms_member_groupperm");
        $module = icms::handler("icms_module")->getByDirname($this->_moduleName);
        $permissions = $this->getPermissions();
        if ($permissions === FALSE) return TRUE;
        foreach ($permissions as $permission) {
            if ($obj != NULL) {
                $gperm_handler->deleteByModule($module->getVar("mid"), $permission["perm_name"], $obj->id());
            } else {
                $gperm_handler->deleteByModule($module->getVar("mid"), $permission["perm_name"]);
            }
        }
        return TRUE;
    }

    /**
     *
     * @param arr|str $event
     */
    public function disableEvent($event) {
        if (is_array($event)) {
            foreach ($event as $v) {
                $this->_disabledEvents[] = $v;
            }
        } else {
            $this->_disabledEvents[] = $event;
        }
    }

    /**
     * Build an array containing all the ids of an array of objects as array
     *
     * @param array $objectsAsArray array of icms_ipf_Object
     */
    public function getIdsFromObjectsAsArray($objectsAsArray) {
        $ret = array();
        foreach ($objectsAsArray as $array) {
            $ret[] = $array[$this->keyName];
        }
        return $ret;
    }

    /**
     * Accessor for the permissions array property
     */
    public function getPermissions() {
        return $this->permissionsArray;
    }

    /**
     * insert a new object in the database
     *
     * @param object $obj reference to the object
     * @param bool $force whether to force the query execution despite security settings
     * @param bool $checkObject check if the object is dirty and clean the attributes
     * @return bool FALSE if failed, TRUE if already present and unchanged or successful
     */
    public function insert(&$obj, $force = false, $checkObject = true, $debug = false) {
        if ($checkObject != false) {
            if (!is_object($obj)) {
                return false;
            }
            /**
             * @TODO: Change to if (!(class_exists($this->className) && $obj instanceof $this->className)) when going fully PHP5
             */
            if (!is_a($obj, $this->className)) {
                $obj->setErrors(get_class($obj) . ' Differs from ' . $this->className);
                return false;
            }
            if (!$obj->isDirty()) {
                $obj->setErrors("Not dirty"); //will usually not be outputted as errors are not displayed when the method returns true, but it can be helpful when troubleshooting code - Mith
                return true;
            }
        }

        if ($obj->seoEnabled) {
            // Auto create meta tags if empty
            $icms_metagen = new icms_ipf_Metagen($obj->title(), $obj->getVar('meta_keywords'), $obj->summary());

            if (!$obj->getVar('meta_keywords') || !$obj->getVar('meta_description')) {

                if (!$obj->meta_keywords()) {
                    $obj->setVar('meta_keywords', $icms_metagen->_keywords);
                }

                if (!$obj->meta_description()) {
                    $obj->setVar('meta_description', $icms_metagen->_meta_description);
                }
            }

            // Auto create short_url if empty
            if (!$obj->short_url()) {
                $obj->setVar('short_url', $icms_metagen->generateSeoTitle($obj->title('n'), false));
            }
        }

        $eventResult = $this->executeEvent('beforeSave', $obj);
        if (!$eventResult) {
            $obj->setErrors('An error occured during the BeforeSave event');
            return false;
        }

        if ($obj->isNew()) {
            $eventResult = $this->executeEvent('beforeInsert', $obj);
            if (!$eventResult) {
                $obj->setErrors('An error occured during the BeforeInsert event');
                return false;
            }

        }   else {
            $eventResult = $this->executeEvent('beforeUpdate', $obj);
            if (!$eventResult) {
                $obj->setErrors('An error occured during the BeforeUpdate event');
                return false;
            }
        }
        if (!$obj->cleanVars()) {
            $obj->setErrors('Variables were not cleaned properly.');
            return false;
        }
        $fieldsToStoreInDB = array();
        foreach ($obj->cleanVars as $k => $v) {
            if ($obj->vars[$k]['data_type'] == XOBJ_DTYPE_INT) {
                $cleanvars[$k] = (int) ($v);
            } elseif (is_array($v)) {
                $cleanvars[ $k ] = $this->db->quoteString( implode( ',', $v ) );
            } else {
                $cleanvars[$k] = $this->db->quoteString($v);
            }
            if ($obj->vars[$k]['persistent']) {
                $fieldsToStoreInDB[$k] = $cleanvars[$k];
            }

        }
        if ($obj->isNew()) {
            if (!is_array($this->keyName)) {
                if ($cleanvars[$this->keyName] < 1) {
                    $cleanvars[$this->keyName] = $this->db->genId($this->table.'_'.$this->keyName.'_seq');
                }
            }

            $sql = 'INSERT INTO ' . $this->table . ' (' . implode(',', array_keys($fieldsToStoreInDB))
                . ') VALUES (' . implode(',', array_values($fieldsToStoreInDB)) . ')';

        } else {

            $sql = 'UPDATE ' . $this->table . ' SET';
            foreach ($fieldsToStoreInDB as $key => $value) {
                if ((!is_array($this->keyName) && $key == $this->keyName)
                    || (is_array($this->keyName) && in_array($key, $this->keyName))) {
                    continue;
                }
                if (isset($notfirst)) {
                    $sql .= ',';
                }
                $sql .= ' ' . $key . ' = ' . $value;
                $notfirst = true;
            }
            if (is_array($this->keyName)) {
                $whereclause = '';
                for ($i = 0; $i < count($this->keyName); $i++) {
                    if ($i > 0) {
                        $whereclause .= ' AND ';
                    }
                    $whereclause .= $this->keyName[$i] . ' = ' . $obj->getVar($this->keyName[$i]);
                }
            } else {
                $whereclause = $this->keyName . ' = ' . $obj->getVar($this->keyName);
            }
            $sql .= ' WHERE ' . $whereclause;
        }

        if ($debug) {
            icms_core_Debug::message($sql);
        }

        if (false != $force) {
            $result = $this->db->queryF($sql);
        } else {
            $result = $this->db->query($sql);
        }

        if (!$result) {
            $obj->setErrors($this->db->error());
            return false;
        }

        if ($obj->isNew() && !is_array($this->keyName)) {
            $obj->assignVar($this->keyName, $this->db->getInsertId());
        }
        $eventResult = $this->executeEvent('afterSave', $obj);
        if (!$eventResult) {
            $obj->setErrors('An error occured during the AfterSave event');
            return false;
        }

        if ($obj->isNew()) {
            $obj->unsetNew();
            $eventResult = $this->executeEvent('afterInsert', $obj);
            if (!$eventResult) {
                $obj->setErrors('An error occured during the AfterInsert event');
                return false;
            }
        } else {
            $eventResult = $this->executeEvent('afterUpdate', $obj);
            if (!$eventResult) {
                $obj->setErrors('n error occured during the AfterUpdate event');
                return false;
            }
        }
        return true;
    }

    /**
     *
     * @param   obj     $obj
     * @param   bool    $force
     * @param   bool    $checkObject
     * @param   bool    $debug
     */
    public function insertD(&$obj, $force = false, $checkObject = true, $debug = false) {
        return $this->insert($obj, $force, $checkObject, true);
    }

    /**
     * Change a value for objects with a certain criteria
     *
     * @param   string  $fieldname  Name of the field
     * @param   string  $fieldvalue Value to write
     * @param   object  $criteria   {@link icms_db_criteria_Element}
     *
     * @return  bool
     **/
    public function updateAll($fieldname, $fieldvalue, $criteria = null, $force = false) {
        $set_clause = $fieldname . ' = ';
        if (is_numeric($fieldvalue)) {
            $set_clause .=  $fieldvalue;
        } elseif (is_array($fieldvalue)) {
            $set_clause .= $this->db->quoteString(implode(',', $fieldvalue));
        } else {
            $set_clause .= $this->db->quoteString($fieldvalue);
        }
        $sql = 'UPDATE '.$this->table.' SET '.$set_clause;
        if (isset($criteria) && is_subclass_of($criteria, 'icms_db_criteria_Element')) {
            $sql .= ' ' . $criteria->renderWhere();
        }
        if (false != $force) {
            $result = $this->db->queryF($sql);
        } else {
            $result = $this->db->query($sql);
        }
        if (!$result) {
            return false;
        }
        return true;
    }

    /**
     * delete all objects meeting the conditions
     *
     * @param object $criteria {@link icms_db_criteria_Element} with conditions to meet
     * @return bool
     */

    public function deleteAll($criteria = NULL) {
        if (isset($criteria) && is_subclass_of($criteria, 'icms_db_criteria_Element')) {
            $rows = 0;
            $objects = $this->getObjects($criteria);
            foreach ($objects as $obj) {
                if ($this->delete($obj, TRUE)) {
                    $rows++;
                }
            }
            return $rows > 0 ? $rows : TRUE;
        }
        return FALSE;
    }

    /**
     *
     */
    public function getModuleInfo() {
        return icms_getModuleInfo($this->_moduleName);
    }

    /**
     *
     */
    public function getModuleConfig() {
        return icms_getModuleConfig($this->_moduleName);
    }

    /**
     *
     */
    public function getModuleItemString() {
        $ret = $this->_moduleName . '_' . $this->_itemname;
        return $ret;
    }

    /**
     *
     * @param $object
     */
    public function updateCounter($object) {
        if (isset($object->vars['counter'])) {
            $new_counter = $object->getVar('counter') + 1;
            $sql = 'UPDATE ' . $this->table . ' SET counter=' . $new_counter
                . ' WHERE ' . $this->keyName . '=' . $object->id();
            $this->query($sql, null, true);
        }
    }

    /**
     * Execute the function associated with an event
     * This method will check if the function is available
     *
     * @param string $event name of the event
     * @param object $obj $object on which is performed the event
     * @return mixed result of the execution of the function or FALSE if the function was not executed
     */
    public function executeEvent($event, &$executeEventObj) {
        if (!in_array($event, $this->_disabledEvents)) {
            if (method_exists($this, $event)) {
                $ret = $this->$event($executeEventObj);
            } else {
                // check to see if there is a hook for this event
                if (isset($this->_eventHooks[$event])) {
                    $method = $this->_eventHooks[$event];
                    // check to see if the method specified by this hook exists
                    if (method_exists($this, $method)) {
                        $ret = $this->$method($executeEventObj);

                    }
                }
                $ret = true;
            }
            return $ret;
        }
        return true;
    }

    /**
     *
     * @param   bool    $withprefix
     */
    public function getIdentifierName($withprefix = true) {
        if ($withprefix) {
            return $this->_itemname . "." . $this->identifierName;
        } else {
            return $this->identifierName;
        }
    }

    /**
     *
     * @param unknown_type $allowedMimeTypes
     * @param unknown_type $maxFileSize
     * @param unknown_type $maxWidth
     * @param unknown_type $maxHeight
     */
    public function enableUpload($allowedMimeTypes = false, $maxFileSize = false, $maxWidth = false, $maxHeight = false) {
        $this->uploadEnabled = true;
        $this->_allowedMimeTypes = $allowedMimeTypes ? $allowedMimeTypes : $this->_allowedMimeTypes;
        $this->_maxFileSize = $maxFileSize ? $maxFileSize : $this->_maxFileSize;
        $this->_maxWidth = $maxWidth ? $maxWidth : $this->_maxWidth;
        $this->_maxHeight = $maxHeight ? $maxHeight : $this->_maxHeight;
    }

    /********** Deprecated ***************/
    /**
     * Set the uploader config options.
     * @deprecated please use enableUpload() instead
     * @param str $_uploadPath
     * @param array $_allowedMimeTypes
     * @param int $_maxFileSize
     * @param int $_maxFileWidth
     * @param int $_maxFileHeight
     * @return VOID
     */
    public function setUploaderConfig($_uploadPath = false, $_allowedMimeTypes = false, $_maxFileSize = false, $_maxWidth = false, $_maxHeight = false) {
        $this->uploadEnabled = true;
        $this->_uploadPath = $_uploadPath ? $_uploadPath : $this->_uploadPath;
        $this->_allowedMimeTypes = $_allowedMimeTypes ? $_allowedMimeTypes : $this->_allowedMimeTypes;
        $this->_maxFileSize = $_maxFileSize ? $_maxFileSize : $this->_maxFileSize;
        $this->_maxWidth = $_maxWidth ? $_maxWidth : $this->_maxWidth;
        $this->_maxHeight = $_maxHeight ? $_maxHeight : $this->_maxHeight;
    }
}

API documentation generated by ApiGen