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
Все още няма коментари.