CArrayDataProvider компонента на YiiFramework

Наскоро започнах да разучавам YiiFramework. Първо исках да разуча основните неща на фреймуорка- как е реализирано MVC-to, връзката с базите от данни, готовите за ползване компоненти и други. След като разработчиците на Yii са всъщност същите, които разработиха и Prado фреймуорка преди предположих, че Yii ще бъде доста подобен, което се оказа не точно така. Е все пак няма да се впускам в детайли сега за всичко, което съм забелязал до момента, а ще се насоча към едно от първите неща, които малко ме подразниха.

А именно това е факта, че повечето компоненти и концепцията са обвързани с Active Records, което е нещо, което аз лично избягвам да ползвам.Това е въпрос на личен избор и не можете да ме съдите за това. Не харесвам цялата концепция и предпочитам да си правя мои собствени заявки – може би това е тема на друг разговор.

Това е ис случая с CArrayDataProvider. Всъщност те имат и CActiveDataProvider, който е свързан с AR и работи перфектно. Прави две заявки – една със записите и още една с техния брой, така че да може да се генерира един хубав пейджър при използване на gridview или listview. Е това не е случая с CArrayDataProvider. Те не се взели в предвид, че някой като мен ще иска да отправи самостоятелно двете заявки без AR и ще иска да установи настоящата страница, общия брой редове и да подаде извадката от тях. Това което всъщност правят е да използват array_slice метода за да вземат нужната порцияот масива при използване с CPager. Проблем е, че това е нещо което се правеше преди доста време … . Компонента се нуждае от всички записи от базата и просто ще одреже нужната порция. Това е лудост. Затова и го модифицирах малко … да много малка промяна, която ми върши работа поне за сега. Просто разширете CArrayDataProvider и го инклуднете в проекта.

class ArrayDataProvider extends CArrayDataProvider
{
	/**
	 * Fetches the data from the persistent data storage.
	 * @return array list of data items
	 */
	protected function fetchData()
	{
		if(($sort=$this->getSort())!==false && ($order=$sort->getOrderBy())!='')
			$this->sortData($this->getSortDirections($order));

		if(($pagination=$this->getPagination())!==false)
		{
			$pagination->setItemCount($this->getTotalItemCount());
			return $this->rawData;
			//return array_slice($this->rawData, $pagination->getOffset(), $pagination->getLimit());
		}
		else
			return $this->rawData;
	}
}

Използва се по същия начин:

$viewData['dataProvider'] = new ArrayDataProvider(
			$array['rows'],
			array(
				'totalItemCount' => $array['count'],
				'pagination'=>array(
					'pageSize' => 10,
				),
			)
		);

Прочети статията на: English

  1. Все още няма коментари.

  1. Все още няма нито един trackback.