/bitrix/modules/vote/lib/attach.php
PHP | 330 lines | 265 code | 17 blank | 48 comment | 42 complexity | 239e1bd3232e448c9662b9717e9ba376 MD5 | raw file
Possible License(s): Apache-2.0
- <?php
- /**
- * Bitrix Framework
- * @package bitrix
- * @subpackage vote
- * @copyright 2001-2016 Bitrix
- */
- namespace Bitrix\Vote;
- use \Bitrix\Main\Entity;
- use \Bitrix\Main\Localization\Loc;
- use \Bitrix\Main\ArgumentException;
- use \Bitrix\Vote\Base\BaseObject;
- use \Bitrix\Vote\DBResult;
- use \Bitrix\Main\SystemException;
- Loc::loadMessages(__FILE__);
- /**
- * Class AttachTable
- * Fields:
- * <ul>
- * <li> ID int mandatory
- * <li> OBJECT_ID int,
- * <li> MODULE_ID string(32),
- * <li> ENTITY_TYPE string(100),
- * <li> ENTITY_ID int,
- * <li> CREATE_TIME datetime,
- * <li> CREATED_BY int
- * </ul>
- *
- */
- class AttachTable extends Entity\DataManager
- {
- /**
- * Returns DB table name for entity
- * @return string
- */
- public static function getTableName()
- {
- return 'b_vote_attached_object';
- }
- /**
- * Returns entity map definition.
- * @return array
- */
- public static function getMap()
- {
- return array(
- 'ID' => array(
- 'data_type' => 'integer',
- 'primary' => true,
- 'autocomplete' => true,
- 'title' => Loc::getMessage('V_TABLE_FIELD_ID'),
- ),
- 'OBJECT_ID' => array(
- 'data_type' => 'integer',
- 'title' => Loc::getMessage('V_TABLE_FIELD_OBJECT_ID'),
- ),
- 'MODULE_ID' => array(
- 'data_type' => 'string',
- 'size' => 32,
- 'title' => Loc::getMessage('V_TABLE_FIELD_MODULE_ID')
- ),
- 'ENTITY_TYPE' => array(
- 'data_type' => 'string',
- 'size' => 100,
- 'title' => Loc::getMessage('V_TABLE_FIELD_ENTITY_TYPE')
- ),
- 'ENTITY_ID' => array(
- 'data_type' => 'integer',
- 'title' => Loc::getMessage('V_TABLE_FIELD_OBJECT_ID'),
- ),
- 'CREATE_TIME' => array(
- 'data_type' => 'datetime',
- 'title' => Loc::getMessage('V_TABLE_FIELD_TIMESTAMP_X'),
- ),
- 'CREATED_BY' => array(
- 'data_type' => 'integer',
- 'title' => Loc::getMessage('V_TABLE_FIELD_AUTHOR_ID'),
- ),
- 'VOTE' => array(
- 'data_type' => '\Bitrix\Vote\VoteTable',
- 'reference' => array(
- '=this.OBJECT_ID' => 'ref.ID',
- ),
- 'join_type' => 'INNER',
- ),
- );
- }
- /**
- * @param array $parameters Array in terms ORM.
- * @return \Bitrix\Vote\DBResult
- */
- public static function getList(array $parameters = array())
- {
- return new DBResult(parent::getList($parameters));
- }
- /**
- * Removes group of attaches
- * @param array $filter Array in terms ORM.
- * @return bool
- * @throws \Bitrix\Main\ArgumentNullException
- */
- public static function deleteByFilter(array $filter)
- {
- if (!$filter)
- {
- throw new \Bitrix\Main\ArgumentNullException('filter');
- }
- $result = static::getList(array(
- 'select' => array('ID'),
- 'filter' => $filter,
- ));
- while($row = $result->fetch())
- {
- if(!empty($row['ID']))
- {
- $resultDelete = static::delete($row['ID']);
- if(!$resultDelete->isSuccess())
- {
- return false;
- }
- }
- }
- return true;
- }
- }
- class Attach extends BaseObject
- {
- public static $storage = array();
- /**
- * Return array where first key is attach array, second - vote array
- * @param integer $id Attach ID.
- * @return array|null
- */
- public static function getData($id)
- {
- $filter = array();
- if (is_array($id))
- {
- $filter = array_change_key_case($id, CASE_UPPER);
- $id = md5(serialize($filter));
- }
- else if (($id = intval($id)) && $id > 0)
- $filter["ID"] = $id;
- else
- return null;
- if (!array_key_exists($id, self::$storage))
- {
- self::$storage[$id] = null;
- $dbRes = AttachTable::getList(array(
- 'select' => array(
- 'O_' => "*",
- 'V_' => 'VOTE.*',
- 'V_LAMP' => 'VOTE.LAMP',
- 'Q_' => 'VOTE.QUESTION.*',
- 'A_' => 'VOTE.QUESTION.ANSWER',
- ),
- 'order' => array(
- 'VOTE.QUESTION.C_SORT' => 'ASC',
- 'VOTE.QUESTION.ID' => 'ASC',
- 'VOTE.QUESTION.ANSWER.C_SORT' => 'ASC',
- 'VOTE.QUESTION.ANSWER.ID' => 'ASC',
- ),
- 'filter' => $filter
- ));
- $attaches = array();
- $votes = array();
- while (($res = $dbRes->fetch()) && $res)
- {
- $attach = array();
- $vote = array();
- $question = array();
- $answer = array();
- foreach ($res as $key => $val)
- {
- if (strpos($key, "O_") === 0)
- $attach[substr($key, 2)] = $val;
- else if (strpos($key, "V_") === 0)
- $vote[substr($key, 2)] = $val;
- else if (strpos($key, "Q_") === 0)
- $question[substr($key, 2)] = $val;
- else if (strpos($key, "A_") === 0)
- $answer[substr($key, 2)] = $val;
- }
- if (!array_key_exists($attach["ID"], $attaches))
- $attaches[$attach["ID"]] = $attach;
- if (!array_key_exists($vote["ID"], $votes))
- $votes[$vote["ID"]] = array_merge($vote, array("QUESTIONS" => array()));
- $vote = $votes[$vote["ID"]];
- $questions = &$vote["QUESTIONS"];
- $qid = "".$question["ID"];
- if (!array_key_exists($qid, $questions))
- $questions[$qid] = array_merge($question, array("ANSWERS" => array()));
- if (!array_key_exists($qid, Question::$storage))
- Question::$storage[$qid] = $question;
- $answers = &$questions[$qid]["ANSWERS"];
- if (!empty($answer))
- {
- switch ($answer["FIELD_TYPE"])
- {
- case 1://checkbox
- $answer["FIELD_NAME"] = 'vote_checkbox_' . $qid;
- break;
- case 2://select
- $answer["FIELD_NAME"] = 'vote_dropdown_' . $qid;
- break;
- case 3://multiselect
- $answer["FIELD_NAME"] = 'vote_multiselect_' . $qid;
- break;
- case 4://text field
- $answer["FIELD_NAME"] = 'vote_field_' . $answer["ID"];
- break;
- case 5 :
- $answer["FIELD_NAME"] = 'vote_field_' . $answer["ID"];
- break;
- default: //radio
- $answer["FIELD_NAME"] = 'vote_radio_' . $qid;
- break;
- }
- $answer["~PERCENT"] = ($question["COUNTER"] > 0 ? $answer["COUNTER"] * 100 / $question["COUNTER"] : 0);
- $answer["PERCENT"] = round($answer["~PERCENT"], 2);
- if (!array_key_exists($answer["ID"], $answers))
- $answers[$answer["ID"]] = $answer;
- if (!array_key_exists($answer["ID"], Answer::$storage))
- Answer::$storage[$answer["ID"]] = $answer;
- }
- $votes[$vote["ID"]] = $vote;
- }
- foreach ($votes as $vote)
- Vote::$storage[$vote["ID"]] = $vote;
- foreach ($attaches as $attach)
- {
- self::$storage[$attach["ID"]] = array($attach, $votes[$attach["OBJECT_ID"]]);
- if (is_string($id))
- {
- self::$storage[$id] = (is_array(self::$storage[$id]) ? self::$storage[$id] : array());
- self::$storage[$id][$attach["ID"]] = array($attach, $votes[$attach["OBJECT_ID"]]);
- }
- }
- }
- return self::$storage[$id];
- }
- /**
- * Returns array of attaches linked to special entity
- * @param array $id Array("ENTITY_TYPE" => "blog", "ENTITY_ID" => 89);.
- * @return mixed
- */
- public static function getDataByEntity(array $id)
- {
- $id1 = md5(serialize($id));
- if (!array_key_exists($id1, self::$storage))
- {
- self::$storage[$id1] = array();
- $dbRes = AttachTable::getList(array(
- 'select' => array(
- 'O_' => "*",
- 'V_' => 'VOTE.*',
- 'V_LAMP' => 'VOTE.LAMP',
- 'Q_' => 'VOTE.QUESTION.*',
- 'A_' => 'VOTE.QUESTION.ANSWER',
- ),
- 'order' => array(
- 'VOTE.QUESTION.C_SORT' => 'ASC',
- 'VOTE.QUESTION.ID' => 'ASC',
- 'VOTE.QUESTION.ANSWER.C_SORT' => 'ASC',
- 'VOTE.QUESTION.ANSWER.ID' => 'ASC',
- ),
- 'filter' => array(
- 'ENTITY_TYPE' => $id['ENTITY_TYPE'],
- 'ENTITY_ID' => $id['ENTITY_ID']
- )
- ));
- if (($res = $dbRes->fetch()) && $res)
- {
- $attach = array();
- $vote = array();
- foreach ($res as $key => $val)
- if (strpos($key, "O_") === 0)
- $attach[substr($key, 2)] = $val;
- else if (strpos($key, "V_") === 0)
- $vote[substr($key, 2)] = $val;
- $vote["QUESTIONS"] = array();
- $questions = &$vote["QUESTIONS"];
- do
- {
- $question = array(); $answer = array();
- foreach ($res as $key => $val)
- {
- if (strpos($key, "Q_") === 0)
- $question[substr($key, 2)] = $val;
- else if (strpos($key, "A_") === 0)
- $answer[substr($key, 2)] = $val;
- }
- $qid = "".$question["ID"];
- if (!array_key_exists($qid, $questions))
- $questions[$qid] = array_merge($question, array("ANSWERS" => array()));
- if (!array_key_exists($qid, Question::$storage))
- Question::$storage[$qid] = $question;
- $answers = &$questions[$qid]["ANSWERS"];
- if (!empty($answer))
- {
- if (!array_key_exists($answer["ID"], $answers))
- $answers[$answer["ID"]] = $answer;
- if (!array_key_exists($answer["ID"], Answer::$storage))
- Answer::$storage[$answer["ID"]] = $answer;
- }
- } while (($res = $dbRes->fetch()) && $res);
- Vote::$storage[$vote["ID"]] = $vote;
- self::$storage[$id1] = array($attach, $vote);
- }
- }
- return self::$storage[$id1];
- }
- }