Ben bu CakePHP'de MVC framework bozmadan nasıl yapabilirim?

2 Cevap php

Genel bir başlık ne için özür dilerim. Ben başlıkları en iyi değilim.

Neyse Kek (bir karma olarak) verileri etrafında geçer yol çok fazla ben bile bu soruyu sormak gerekir nedeni budur. Ben görünümüne denetleyicisi bir değişken / obj geçtiğinde, ben daha çok bir dizi / sözlük (yani $ ördek ['olmak zorunda değil (yani $ ördek-> şarlatan ()) sorular sorabilirsiniz bir nesne olsaydı Duck '] [' şarlatan '] == true) bu kolay olurdu.

Ne benim app var bir kullanıcı x sahibi veya olmayan öğelerin bir listesidir. Bazı görünümlerde ben veritabanı / app tüm öğeleri (yani paginate) görüntülemek ve her madde için bunu sahibi veya kullanıcı oturum açmış olmadığını bilmek gerekir. Bu soruyu cevaplamak için ben Modelin içinde yapılır, (nedeniyle karmaşık bir HABTM ilişki için) bir sorgu yapmak gerekir. Diğer bir deyişle benim madde modeli kullanıcıya ait true bir fonksiyon isOwnedByUser ($ User_id, $ item_id) sahiptir. Ben görünümden bu işlevi çağırmak istiyorum.

Doğal olarak bu MVC çerçevesini ihlal edilir, ama ben bunu başka nasıl emin değilim. Ben dört fikirleri vardı:

Idea 1:

Bir yardımcı içinde bunu:

App:Import('Model','Item');
$item = new Item();
$item->isOwnedByUser($user_id,$item_id);

ve görünümünden bir yardımcı aramak (ve $ item_id ve tabii $ User_id geçmek). Ama bu gerçekten bir MVC framework ihlal.

Idea 2:

Item_controller.php içinde bir eylem oluşturun ve requestAction kullanarak görünümünde eylem çağrısı (). Ama ben heard that this was extremeley inefficent

Şimdi benim soruna bir çözüm için looking oldu ama onlara göre bu iki fikir kötü olduğunda ben buldum, bu iki fikir yüzden iki daha fazla çözüm ile geldi:

Idea 3:

Görünümüne paginated verileri dönerken ben o / o öğeye sahip olmadığını görmek için, kullanıcının kimliği kaydedilir karşı görünümünde anahtarını kontrol edebilir, böylece tüm öğeleri bir 'user_id' anahtara sahip olduğunuzdan emin olabilirsiniz. Ama bu) yeniden yazma sayfalama b a) Bana gerektirecek, özellikle belirli görüşleri (arama) için çok çirkin sorgular, c) genel çirkinlik ve yavaşlık. Yani bu fikri terk etmeye karar

Idea 4:

Bir bakış, bir öğe kullanıcıya ait olmadığını bilmek gerekir her zaman, ben sadece bir kullanıcı sahibi ve görünümde sadece kullanıcının sahip olmadığını denetlemek için () in_array'in kullanabilirsiniz TÜM öğeleri içeren denetleyicisi başka bir dizi ileteyim öğeyi dedi. Tabii ki bu sorun açıktır: kullanıcı öğeleri çok ne olur?

Kısacası ben bu sıkışmış ve ben nereye buradan gitmek için hiçbir ipucu var ve ben tüm yardım takdir ediyorum! Teşekkürler!

2 Cevap

Ben 3 ve 4 birleştirmek istiyorum.

Sizin eylem, tüm paginated öğeler olsun sonra:

$items = $this->paginate('Item');

Kendi kimliklerini almak ve kullanıcının öğeleri tüm almak için kullanıcı kimliği ile birleştiren.

$itemIds = Set::extract('/Item/id', $items);

$usersItems = $this->Item->User->find
    (
    	'all',
    	array
    	(
    		'conditions' => array
    		(
    			'User.id' = $userId,
    			'Item.id' => $itemIds
    		),
    		'fields' => array('User.id', 'Item.id')
    	)
);

Şimdi tercih bir biçimde $ usersItems ayarlayın ve bu ve görünüm için $ öğeleri hem de ayarlayabilirsiniz. Yani) muhtemelen ayarla olacağını hariç ::) (seçeneğin 4 ve İn_Array'in getirmek ekstresi () ya da Set :: çek (olurdu.

Böyle bir şey yapmak gerekir:

if (Set::extract(sprintf('/Item[id=%s]', $itemId), $usersItems))
{
    // user has the item
}

(Ben yani ... bunu :) başarısız olursa ne yapacağını bilmek benim bellek bu yazdı)

Edit:

Alternatif olarak, böyle bir şey (sadece Set::extract() döngünün dışına taşımak için emin olun, yukarıdaki daha hızlı olmalı) yapabilirsiniz:

$usersItemIds = Set::extract('/Item/id', $usersItems);

if (in_array($itemId, $usersItemIds))
{
    // user has the item
}

Bu eski bir soru olduğunu biliyorum ama belki ACL bileşeni burada iyi bir seçenek olacak gibi görünüyor.