هل من الممكن صفحة وفرز نموذجين مختلفين في نفس العرض في CakePhP؟

StackOverflow https://stackoverflow.com/questions/4202240

سؤال

أريد أن أفعل شيئًا مستقيمًا جدًا وبسيطًا. أريد أن أحصل على مجموعتين مختلفتين من البيانات المربوطة على نفس الصفحة. تعتمد مجموعتان مختلفتان على نماذج مختلفة. من أجل المناقشة ، سنقول إنهم كذلك Image و Item.

يمكنني إعداد اثنين من أجهزة الاستدعاء لنموذجين ، والحصول على المجموعة الصحيحة من الكائنات. يمكنني الحصول على روابط النداء الصحيحة. ولكن عندما يتعلق الأمر باتباع الروابط إلى المعلمات فعليًا ، فإن كلا البيجر يقرأون المعلمات ويفترضون أنهما ينطبقون عليها.

ينتهي الأمر بالبحث عن شيء من هذا القبيل:

   $this->paginate = array (
        'Item'=>array(
            'conditions'=>array('user_id'=>$id),
            'limit' => 6, 
            'order' => array(
                'Item.votes'=>'desc', 
                'Item.created'=>'desc'
            ),
            'contain'=>array(
                'User', 
                'ItemImage' => array (
                    'order'=>'ItemImage__imageVotes desc'
                )
            )
        ),
        'Image'=>array(
            'limit'=>6,
            'contain'=>array(
                'User',
                'ItemImage'=>array('Item'),
            ),
            'order'=>array(
                'Image.votes'=>'desc',
                'Image.views'=>'desc'
            ),
            'conditions'=>array(
                'Image.isItemImage'=>1,
                'Image.user_id'=>$id
            )
        )
    );
    $this->set('items', $this->paginate('Item'));   
    $this->set('images', $this->paginate('Image'));

هذا في وحدة التحكم. في العرض ، لدي روابط فرز تبدو مثل هذا:

<div class="control"><?php echo $this->Paginator->sort('Newest', 'Image.created', array('model'=>'Image')); ?></div>

ومع ذلك ، فإن ذلك يعطي رابطًا يبدو مثل هذا:

http://localhost/profile/37/page:1/sort:Image.created/direction:asc

لا يوجد شيء هناك لإخبار Paginator أي نموذج أعتزم فرزه. لذلك عندما أنقر على الرابط ، يحاول فرز كلا النموذجين Image.created. والنتيجة هي خطأ ، لأن Item لا يمكن فرزها Image.created. هل هناك شيء أفعله خطأ؟ أم أن هذا شيء لا يدعمه Paginator's Cakephp؟

هل كانت مفيدة؟

المحلول

سيكون الحل الأسهل هو تنفيذ كلا الشبكات كعناصر تجلب بياناتها الخاصة واستخدام AJAX لتحميل العناصر في الصفحة.

الخيار الآخر الوحيد هو تعديل المعلمات حتى تقوم بتمرير المعاملات لكلتا الشبكات لكل شبكة عند الفرز أو التنقل عبر الصفحات. الرمز الذي تم نشره بواسطة Leo أعلاه هو بداية جيدة. يمكنك إعداد مفتاح النموذج من صفيف التراجع على كل param المسماة والتأكد من اجتياز جميع معاملات URL إلى وظيفة التراجع ويجب أن تتجه في الاتجاه الصحيح.

نصائح أخرى

ستحتاج إلى تجاوز طريقة الترجيع لنموذج وحدة التحكم في تلك الصفحة.

فعلت شيئًا مشابهًا ، ربما سيساعد هذا المقتطف:

function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array())
{
    $pageParams = compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive', 'group');
    $this->contain('ModuleType', 'NodeDescriptor');
    $pageItems = $this->find('all',$pageParams);
    $pagesOut = array();
    foreach($pageItems as $pageItem)
    {
        $status = $pageItem['SiteAdmin']['status_id'];
        $moduleInfo = null;
        $nodeTitle = $pageItem['NodeDescriptor']['title'];
        $published = $pageItem['NodeDescriptor']['published'];
        $pageitemID = $pageItem['SiteAdmin']['id'];
        $moduleId =  $pageItem['SiteAdmin']['module_id'];
        $contName =  $pageItem['ModuleType']['controller'];
        if($moduleId)
        {
            $thisModel = ClassRegistry::getObject($moduleType);
            $thisModel->contain();
            $moduleInfo = $thisModel->read(null,$moduleId);
            $moduleInfo = $moduleInfo[$moduleType];
        }
        $pagesOut[] = array(
            'status'=>$status,
            'node'=>$nodeTitle,
            'published'=>$published,
            'info'=>$moduleInfo,
            'module_id'=>$moduleId,
            'contName'=>$contName,
            'pageitem_id'=>$pageitemID);
    }
    return $pagesOut;
}

من خلال القيام بذلك بهذه الطريقة ، يمكنك التحكم في المعلمات التي تم تمريرها إلى التربط ، بحيث يمكنك تمرير بيانات محددة من النماذج ، وعلامات التحكم ، إلخ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top