qcubed/framework

View on GitHub
assets/php/examples/datagrid/qcheckboxcolumn.php

Summary

Maintainability
A
25 mins
Test Coverage
<?php
    require_once('../qcubed.inc.php');

    class ExampleCheckColumn1 extends QDataGrid_CheckBoxColumn {
        protected function GetAllIds()
        {
            return Person::QueryPrimaryKeys();
        }
    }


    class ExampleCheckColumn2 extends QDataGrid_CheckBoxColumn {
        protected function GetItemCheckedState ($item) {
            if(null !== $item->GetVirtualAttribute('assn_item')) {
                return true;
            }
            else {
                return false;
            }
        }

        public function SetItemCheckedState($itemId, $blnChecked) {
            $objProject = Project::Load($itemId);
            if($blnChecked)
            {
                // Simulate an associating with the project
                QApplication::DisplayAlert('Associating '.$objProject->Name);

                // To actually do the association, we would execute the following:
                /*
                $objParentProject = Project::Load(1);    // We were associating the ACME project
                $objParentProject->AssociateProjectAsRelated ($objProject);
                 */
            }
            else
            {
                // Simulate unassociating the Project
                QApplication::DisplayAlert('Unassociating '.$objProject->Name);
            }


        }
    }



class ExampleForm extends QForm {
        // Declare the DataGrid and Response Label
        protected $dtgPersons;
        protected $lblResponse;

        /** @var  QDataGrid_CheckBoxColumn */
        protected $colSelect;
        
        protected $dtgProjects;
        protected $colProjectSelected;

        protected $btnGo;

        protected function Form_Create() {

            $this->dtgPersons_Create();
            $this->dtgProjects_Create();

            
            // Define the Label -- keep it blank for now
            $this->lblResponse = new QLabel($this);
            $this->lblResponse->HtmlEntities = false;
        }

        protected function dtgPersons_Create() {
            // Define the DataGrid
            $this->dtgPersons = new QDataGrid($this);

            // Specify Pagination with 10 items per page
            $objPaginator = new QPaginator($this->dtgPersons);
            $this->dtgPersons->Paginator = $objPaginator;
            $this->dtgPersons->ItemsPerPage = 10;

            // Define Columns
            $col = $this->dtgPersons->CreateNodeColumn('Person ID', QQN::Person()->Id);
            $col->CellStyler->Width = 100;
            $col = $this->dtgPersons->CreateNodeColumn('First Name', [QQN::Person()->FirstName, QQN::Person()->LastName]);
            $col->CellStyler->Width = 200;
            $col = $this->dtgPersons->CreateNodeColumn('Last Name', [QQN::Person()->LastName, QQN::Person()->LastName]);
            $col->CellStyler->Width = 200;

            //Create the select column, a subclass of QDataGrid_CheckBoxColumn
            $this->colSelect = new ExampleCheckColumn1('');
            $this->colSelect->ShowCheckAll = true;
            $this->colSelect->CellStyler->Width = 20;

            $this->dtgPersons->AddColumnAt(0, $this->colSelect);

            // Let's pre-default the sorting by last name (column index #2)
            $this->dtgPersons->SortColumnIndex = 2;

            // Specify the DataBinder method for the DataGrid
            $this->dtgPersons->SetDataBinder('dtgPersons_Bind');

            $this->dtgPersons->AddAction(new QHtmlTableCheckBoxColumn_ClickEvent(), new QAjaxAction ('chkSelected_Click'));

            // Make sure changes to the database by other users are reflected in the datagrid on the next event
            $this->dtgPersons->Watch(QQN::Person());

        }

        protected function dtgPersons_Bind() {
            // Let the datagrid know how many total items and then get the data source
            $this->dtgPersons->TotalItemCount = Person::CountAll();
            $this->dtgPersons->DataSource = Person::LoadAll(QQ::Clause(
                $this->dtgPersons->OrderByClause,
                $this->dtgPersons->LimitClause
            ));
        }

        // This btnCopy_Click action will actually perform the copy of the person row being copied
        protected function chkSelected_Click($strFormId, $strControlId, $params) {
            $blnChecked = $params['checked'];

            // The database record primary key is embedded after the last underscore in the id of the checkbox
            $idItems = explode('_', $params['id']);
            $intPersonId = end($idItems);

            if ($intPersonId == 'all') {
                $strResponse = QApplication::HtmlEntities('You just selected all. ');
            }
            else {
                $objPerson = Person::Load($intPersonId);

                // Let's respond to the user what just happened
                if ($blnChecked)
                    $strResponse = QApplication::HtmlEntities('You just selected ' . $objPerson->FirstName . ' ' . $objPerson->LastName . '.');
                else
                    $strResponse = QApplication::HtmlEntities('You just deselected ' . $objPerson->FirstName . ' ' . $objPerson->LastName . '.');
                $strResponse .= '<br/>';
            }
            // Let's get the selected person

            // Now, let's go through all the checkboxes and list everyone who has been selected
            $arrIds = $this->colSelect->GetCheckedItemIds();
            $strNameArray = array();
            foreach($arrIds as $strId) {
                $objPerson = Person::Load($strId);
                $strName = QApplication::HtmlEntities($objPerson->FirstName . ' ' . $objPerson->LastName);
                $strNameArray[] = $strName;
            }

            $strResponse .= 'The list of people who are currently selected: ' . implode(', ', $strNameArray);

            // Provide feedback to the user by updating the Response label
            $this->lblResponse->Text = $strResponse;
        }

        protected function dtgProjects_Create() {
            // Setup DataGrid
            $this->dtgProjects = new QDataGrid($this);
            $this->dtgProjects->CssClass = 'datagrid';

            // Datagrid Paginator
            $this->dtgProjects->Paginator = new QPaginator($this->dtgProjects);

            // If desired, use this to set the numbers of items to show per page
            //$this->lstProjectsAsRelated->ItemsPerPage = 20;

            // Specify Whether or Not to Refresh using Ajax
            $this->dtgProjects->UseAjax = true;

            // Specify the local databind method this datagrid will use
            $this->dtgProjects->SetDataBinder('dtgProjects_Bind', $this);

            // Setup DataGridColumns
            $this->colProjectSelected = new ExampleCheckColumn2(QApplication::Translate('Select'));
            
            $this->dtgProjects->AddColumn($this->colProjectSelected);

            $this->dtgProjects->CreateNodeColumn(QApplication::Translate('Name'), QQN::Project()->Name);

            // Make sure changes to the database by other users are reflected in the datagrid on the next event
            $this->dtgProjects->Watch(QQN::Project());
        }
        
        
        public function colProjectSelectedCheckbox_Created(Project $_ITEM, QCheckBox $ctl)
        {
            //If it's related to ACME, start it off checked
            if(null !== $_ITEM->GetVirtualAttribute('assn_item'))
                $ctl->Checked = true;
            //You could perform an IsProjectAsRelatedAssociated call here instead, but
            //that would cause a database hit
        }

        public function dtgProjects_Bind() {
            // Get Total Count b/c of Pagination
            $this->dtgProjects->TotalItemCount = Project::CountAll();

            $objClauses = array();
            if ($objClause = $this->dtgProjects->OrderByClause)
                $objClauses[] = $objClause;
            if ($objClause = $this->dtgProjects->LimitClause)
                $objClauses[] = $objClause;

            // Create a virtual attribute that lets us know if this Project is related to ACME
            $objClauses[] = QQ::Expand(
                QQ::Virtual('assn_item', 
                    QQ::SubSql(
                        'select 
                            project_id
                         from 
                             related_project_assn
                         where 
                            child_project_id = {1} 
                             and project_id = 1', 
                            QQN::Project()->Id)
                )
            );
            
            $this->dtgProjects->DataSource = Project::LoadAll($objClauses);
        }
    }

    ExampleForm::Run('ExampleForm');
?>