[TYPO3-mvc] Putting together a object for updateAction, from ExtJs/json

dennis ahrens dennis.ahrens at googlemail.com
Wed Mar 17 14:06:28 CET 2010


Hi Dmitri,

I don't know how to configure the JsonReader and the JsonWriter to
match the expected structure. If you're using a default store
configured with autoSave:true and writeAllFields: false the data is
placed automatically in an HTTP parameter called data. I think the
name 'data' is caused by the reader configuration, which wants it's
data in a json object property called data:

the configuration object for the Reader looks like this:

{totalProperty: 'total', successProperty: 'success', idProperty:
'uid', root: 'data', fields:[....]}

The Reader can interpret reponse data which looks like this:
{"message":"foo","total":0,"success":true,"data":[]}

When using the CRUD features shipped by extjs the described HTTP
request param named 'data' is send to the server.

regards
Dennis

2010/3/17 Dmitri Pisarev <dimaip at gmail.com>:
> Hi Dennis,
> I still don't understand why not to create a proper object in ExtJS right a
> way, as in my example. Why do you ever have to access _POST directly?
>
> On 17.03.2010 12:54, dennis ahrens wrote:
>>
>> Hi Dmitri,
>>
>> the data comes in one POST/GET parameter and is encoded in json. The
>> "problem" is the loacation (in the code) where to apply the data to
>> the php-object. Of course it feels much better when the action
>> receives a modified object where the json data is applied instead of
>> the array containing the changes.
>> For fluid templates the magic is done when initializing the controller
>> and it's action. I think  the implementation should be done at the
>> same location.
>> Can anyone give a cleaner view for this scenario?
>>
>> regards
>> Dennis
>>
>> 2010/3/17 Dmitri Pisarev<dimaip at gmail.com>:
>>>
>>> Hi!
>>> I'm a complete novice at extbase, but the way you do it looks really
>>> strange
>>> to me.
>>> Why not do this like this:
>>>        /**
>>>         * Updates client.
>>>         *
>>>         * @param Tx_Alex_Domain_Model_Client $client
>>>         * @return string The rendered view
>>>         * @dontverifyrequesthash
>>>         */
>>>        public function updateAction($client) {
>>>                $this->clientRepository->update($client);
>>>                $this->flashMessages->add('Your client was updated.');
>>>                echo '{success:true}';
>>>        }
>>> And from extjs submit something like this:
>>> tx_alex_pi1[__referer][ac...    index
>>> tx_alex_pi1[__referer][co...    Client
>>> tx_alex_pi1[__referer][ex...    Alex
>>> tx_alex_pi1[client][__identity] 1
>>> tx_alex_pi1[client][addre...    Leninsky
>>> tx_alex_pi1[client][telep...    3395701
>>> tx_alex_pi1[client][title...    Nord-Way
>>> Sorry, firebug has croped the names, but you get the idea.
>>>
>>> Regards,
>>> Dmitri.
>>> On 15.03.2010 22:18, dennis ahrens wrote:
>>>>
>>>> Hi Søren,
>>>>
>>>> I've solved the problem like shown in the following action:
>>>>
>>>>        /**
>>>>         * Updates a record
>>>>         *
>>>>         * TODO: make the extjs Store to use the extbase controller
>>>> parameter
>>>> signature, that we
>>>>         * can fetch the data out of $this->request->getArgument('data');
>>>>         *
>>>>         * @return void
>>>>         */
>>>>        public function updateAction() {
>>>>                try {
>>>>                                // read and prepare data from POST
>>>>                        $dataJson = t3lib_div::_POST('data');
>>>>                        $dataArray = json_decode($dataJson,true);
>>>>                        $uid = (int) t3lib_div::_POST('uid');
>>>>                                // fetch the projekt that should be
>>>> updated
>>>>                        $forschungsprojekt =
>>>> $this->forschungsprojektRepository->findByUid($uid);
>>>>                                // apply the changes to the object
>>>>                        $forschungsprojekt =
>>>> $this->applyUpdate($dataArray,$forschungsprojekt);
>>>>                                // apply the changes to the database
>>>>
>>>>  $this->forschungsprojektRepository->update($forschungsprojekt);
>>>>                                // sync group configuration for access
>>>> management
>>>>                        $this->accessManager->write($forschungsprojekt);
>>>>                                // tell the view layer that everything is
>>>> ok
>>>>                        $this->view->assign('changedData',$dataArray);
>>>>                        $this->view->assign('success',TRUE);
>>>>                        $this->view->assign('message', '');
>>>>                } catch (Exception $e) {
>>>>                        if (!is_array($dataArray))
>>>>                                $dataArray = array();
>>>>                                // tell the view layer that something is
>>>> not ok ... :)
>>>>                        $this->view->assign('changedData',$dataArray);
>>>>                        $this->view->assign('success',FALSE);
>>>>                        $this->view->assign('message','Forschungsprojekt
>>>> konnte nicht
>>>> gespeichert werden');
>>>>                                // tell the developer a little bit about
>>>> the occured error
>>>>                        t3lib_div::sysLog('Exception: ' .
>>>> $e->getMessage(),'FhhForschungsprojekte',4);
>>>>                        t3lib_div::sysLog('Exception-Trace: ' .
>>>> $e->getTraceAsString(),'FhhForschungsprojekte',3);
>>>>                }
>>>>        }
>>>>
>>>> The "mapping" between the json data and the model is hidden behind
>>>> applyUpdate().
>>>> I use the extjs jsonwriter config option 'writeAllFields' for just
>>>> telling the server about the made changes.
>>>>
>>>> I think it would be much better to do the mapping when intializing the
>>>> action argument - but haven't found the time yet to dig deeper
>>>> there...
>>>>
>>>> regards
>>>> Dennis
>>>>
>>>> 2010/3/15 Søren Malling<soren.malling at gmail.com>:
>>>>>
>>>>> Hi,
>>>>>
>>>>> Getting closer to the goal of my first Extbase and ExtJs project I've
>>>>> ran into a issue.
>>>>>
>>>>> When posting to my Extbase page, where the update-, index-,
>>>>> createAction etc are placed, the data is posted as POST. The update
>>>>> action requires a object of Tx_Groupmembers_Domain_Model_Member
>>>>>
>>>>> public function updateAction(Tx_Groupmembers_Domain_Model_Member
>>>>> $member)
>>>>> {
>>>>>
>>>>> but how do i create a object mathcing the "shape" of a Domain_Model
>>>>> object? Is it possible/correc to remove the
>>>>> "Tx_Groupmembers_Domain_Model_Member $member" part of the function and
>>>>> then create the a object based on the "POST" data or should i look in
>>>>> to ExtJs to see how I can submit it like a object in someway?
>>>>>
>>>>> Regards,
>>>>>
>>>>> Søren
>>>>> _______________________________________________
>>>>> TYPO3-project-typo3v4mvc mailing list
>>>>> TYPO3-project-typo3v4mvc at lists.typo3.org
>>>>>
>>>>> http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-project-typo3v4mvc
>>>>>
>>>
>>> _______________________________________________
>>> TYPO3-project-typo3v4mvc mailing list
>>> TYPO3-project-typo3v4mvc at lists.typo3.org
>>> http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-project-typo3v4mvc
>>>
>
> _______________________________________________
> TYPO3-project-typo3v4mvc mailing list
> TYPO3-project-typo3v4mvc at lists.typo3.org
> http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-project-typo3v4mvc
>


More information about the TYPO3-project-typo3v4mvc mailing list