本文整理汇总了PHP中mage\cms\test\page\CmsIndex类的典型用法代码示例。如果您正苦于以下问题:PHP CmsIndex类的具体用法?PHP CmsIndex怎么用?PHP CmsIndex使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了CmsIndex类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的PHP代码示例。
示例1: processAssert
/**
* Assert that products' MAP has been applied before checkout.
*
* @param CatalogCategory $category
* @param Customer $customer
* @param Address $address
* @param CatalogCategoryView $catalogCategoryView
* @param CmsIndex $cmsIndex
* @param CatalogProductView $catalogProductView
* @param CheckoutCart $cart
* @param CheckoutOnepage $checkoutOnePage
* @param array $products
* @return void
*/
public function processAssert(CatalogCategory $category, Customer $customer, Address $address, CatalogCategoryView $catalogCategoryView, CmsIndex $cmsIndex, CatalogProductView $catalogProductView, CheckoutCart $cart, CheckoutOnepage $checkoutOnePage, array $products)
{
for ($i = 0; $i < count($products); $i++) {
$cart->getCartBlock()->clearShoppingCart();
$productName = $products[$i]->getName();
$cmsIndex->open();
$cmsIndex->getTopmenu()->selectCategory($category->getName());
// Check that price is not present on category page.
$listProductBlock = $catalogCategoryView->getListProductBlock();
$productPriceBlock = $listProductBlock->getProductPriceBlock($productName);
$productPriceBlock->clickForPrice();
\PHPUnit_Framework_Assert::assertFalse($productPriceBlock->getMapBlock()->isPriceVisible(), 'Price is present in MSRP dialog on category page.');
// Check that price is not present on product page.
$listProductBlock->openProductViewPage($productName);
\PHPUnit_Framework_Assert::assertFalse($catalogProductView->getViewBlock()->getPriceBlock()->isRegularPriceVisible(), 'Price is present in View block on product page.');
// Check that price is not present on cart.
$catalogProductView->getViewBlock()->addToCart($products[$i]);
\PHPUnit_Framework_Assert::assertTrue($cart->getCartBlock()->getCartItem($products[$i])->isMsrpVisible(), "MSRP link is not visible in cart.");
// Check that price is present on review block in onepage checkout page.
$cart->getCartBlock()->getProceedToCheckoutBlock()->proceedToCheckout();
$checkoutMethodBlock = $checkoutOnePage->getLoginBlock();
$billingBlock = $checkoutOnePage->getBillingBlock();
$paymentMethodBlock = $checkoutOnePage->getPaymentMethodsBlock();
$shippingBlock = $checkoutOnePage->getShippingMethodBlock();
$checkoutMethodBlock->guestCheckout();
$checkoutMethodBlock->clickContinue();
$billingBlock->fillBilling($address, $customer);
$billingBlock->clickContinue();
$shippingBlock->selectShippingMethod(['shipping_service' => 'Flat Rate', 'shipping_method' => 'Fixed']);
$shippingBlock->clickContinue();
$paymentMethodBlock->selectPaymentMethod(['method' => 'checkmo']);
$paymentMethodBlock->clickContinue();
\PHPUnit_Framework_Assert::assertEquals(number_format($products[$i]->getPrice(), 2), $checkoutOnePage->getReviewBlock()->getTotalBlock()->getData('subtotal'), "Subtotal in checkout one page for {$productName} is not equal to expected.");
}
}
开发者ID:hientruong90,项目名称:ee_14_installer,代码行数:49,代码来源:AssertProductMapAppliedBeforeCheckout.php
示例2: processAssert
/**
* Assert that Wishlist can't be find by another Customer (or guest) via "Wishlist Search".
*
* @param CustomerAccountLogout $customerAccountLogout
* @param CmsIndex $cmsIndex
* @param CatalogCategoryView $catalogCategoryView
* @param SearchResult $searchResult
* @param CatalogCategory $category
* @param Customer $customer
* @param Wishlist $wishlist
* @return void
*/
public function processAssert(CustomerAccountLogout $customerAccountLogout, CmsIndex $cmsIndex, CatalogCategoryView $catalogCategoryView, SearchResult $searchResult, CatalogCategory $category, Customer $customer, Wishlist $wishlist)
{
$customerAccountLogout->open();
$cmsIndex->open()->getTopmenu()->selectCategory($category->getName());
$catalogCategoryView->getWishlistSearchBlock()->searchByCustomer($customer);
\PHPUnit_Framework_Assert::assertFalse($searchResult->getWishlistSearchResultBlock()->isWishlistVisibleInGrid($wishlist), "Multiple wishlist is visible on wishlist search result page.");
}
开发者ID:MikeTayC,项目名称:magento.dev,代码行数:19,代码来源:AssertMultipleWishlistIsPrivate.php
示例3: processAssert
/**
* Assert that created CMS page displays with error message on unassigned store views on frontend.
*
* @param CmsPage $cms
* @param FrontendCmsPage $frontendCmsPage
* @param Browser $browser
* @param CmsIndex $cmsIndex
* @param string|null $notFoundMessage
* @return void
*/
public function processAssert(CmsPage $cms, FrontendCmsPage $frontendCmsPage, Browser $browser, CmsIndex $cmsIndex, $notFoundMessage = null)
{
$browser->open($_ENV['app_frontend_url'] . $cms->getIdentifier());
$notFoundMessage = $notFoundMessage !== null ? $notFoundMessage : self::ERROR_MESSAGE;
$cmsIndex->getHeaderBlock()->selectStore('Default Store View');
\PHPUnit_Framework_Assert::assertContains($notFoundMessage, $frontendCmsPage->getCmsPageContentBlock()->getPageContent(), 'Wrong page content is displayed.');
}
开发者ID:cewolf2002,项目名称:magento,代码行数:17,代码来源:AssertCmsPageDisabledOnUnassignedStoreView.php
示例4: processAssert
/**
* Assert that apache redirect works by opening category page and asserting index.php in its url.
*
* @param CatalogCategory $category
* @param CmsIndex $homePage
* @param BrowserInterface $browser
*/
public function processAssert(CatalogCategory $category, CmsIndex $homePage, BrowserInterface $browser)
{
$category->persist();
$homePage->open();
$homePage->getTopmenu()->selectCategory($category->getName());
\PHPUnit_Framework_Assert::assertTrue(strpos($browser->getUrl(), 'index.php') === false, 'Apache redirect for category does not work.');
}
开发者ID:MikeTayC,项目名称:magento.dev,代码行数:14,代码来源:AssertRewritesEnabled.php
示例5: processAssert
/**
* Assert that Magento successfully installed.
*
* @param InstallWizardEnd $installWizardEnd
* @param CmsIndex $cmsIndex
* @param string $successInstallMessage
* @return void
*/
public function processAssert(InstallWizardEnd $installWizardEnd, CmsIndex $cmsIndex, $successInstallMessage)
{
// Check InstallWizardEnd page title text.
\PHPUnit_Framework_Assert::assertEquals($successInstallMessage, $installWizardEnd->getMainBlock()->getTitle());
// Check if header block on CmsIndex page is visible.
$cmsIndex->open();
\PHPUnit_Framework_Assert::assertTrue($cmsIndex->getHeaderBlock()->isVisible());
}
开发者ID:QiuLihua83,项目名称:magento-ee,代码行数:16,代码来源:AssertSuccessInstall.php
示例6: processAssert
/**
* Assert that Catalog Price Rule is applied for product(s) in Shopping Cart
* according to Priority(Priority/Stop Further Rules Processing).
*
* @param InjectableFixture $product
* @param CatalogProductView $pageCatalogProductView
* @param CmsIndex $cmsIndex
* @param CatalogCategoryView $catalogCategoryView
* @param CheckoutCart $pageCheckoutCart
* @param array $prices
* @return void
*/
public function processAssert(InjectableFixture $product, CatalogProductView $pageCatalogProductView, CmsIndex $cmsIndex, CatalogCategoryView $catalogCategoryView, CheckoutCart $pageCheckoutCart, array $prices)
{
$cmsIndex->open();
$cmsIndex->getTopmenu()->selectCategory($product->getCategoryIds()[0]);
$catalogCategoryView->getListProductBlock()->openProductViewPage($product->getName());
$pageCatalogProductView->getViewBlock()->addToCart($product);
$actualGrandTotal = $pageCheckoutCart->getCartBlock()->getCartItem($product)->getCartItemTypePrice('price');
\PHPUnit_Framework_Assert::assertEquals($prices['grand_total'], $actualGrandTotal);
}
开发者ID:test3metizsoft,项目名称:test,代码行数:21,代码来源:AssertCatalogPriceRuleAppliedInShoppingCart.php
示例7: processAssert
/**
* Check that after input some text(e.g. product name) into search field, drop-down window is appeared.
* Window contains requested entity and number of quantity.
*
* @param CmsIndex $cmsIndex
* @param CatalogSearchQuery $catalogSearch
* @return void
*/
public function processAssert(CmsIndex $cmsIndex, CatalogSearchQuery $catalogSearch)
{
$cmsIndex->open();
$searchBlock = $cmsIndex->getSearchBlock();
$queryText = $catalogSearch->getQueryText();
$searchBlock->fillSearch($queryText);
$isVisible = $catalogSearch->hasData('num_results') ? $searchBlock->isSuggestSearchVisible($queryText, $catalogSearch->getNumResults()) : $searchBlock->isSuggestSearchVisible($queryText);
\PHPUnit_Framework_Assert::assertTrue($isVisible, 'Block "Suggest Search" when searching was not found.');
}
开发者ID:chucky515,项目名称:Magento-CE-Mirror,代码行数:17,代码来源:AssertSuggestSearchingResult.php
示例8: processAssert
/**
* Assert that product is not present in Wishlist on frontend.
*
* @param WishlistIndex $wishlistIndex
* @param CmsIndex $cmsIndex
* @param Customer $customer
* @param FrontendActionsForCustomer $frontendActionsForCustomer
* @param InjectableFixture[] $products
* @return void
*/
public function processAssert(WishlistIndex $wishlistIndex, CmsIndex $cmsIndex, Customer $customer, FrontendActionsForCustomer $frontendActionsForCustomer, array $products)
{
$frontendActionsForCustomer->loginCustomer($customer);
$cmsIndex->getTopLinksBlock()->openAccountLink("My Wishlist");
$itemBlock = $wishlistIndex->getItemsBlock();
foreach ($products as $itemProduct) {
\PHPUnit_Framework_Assert::assertFalse($itemBlock->getItemProductBlock($itemProduct)->isVisible(), "Product '{$itemProduct->getName()}' is present in Wishlist on frontend.");
}
}
开发者ID:chucky515,项目名称:Magento-CE-Mirror,代码行数:19,代码来源:AssertProductsIsAbsentInWishlist.php
示例9: processAssert
/**
* Assert that Catalog Price Rule is applied for product(s) in Catalog
* according to Priority(Priority/Stop Further Rules Processing).
*
* @param InjectableFixture $product
* @param CmsIndex $cmsIndex
* @param CatalogCategoryView $catalogCategoryView
* @param array $prices
* @return void
*/
public function processAssert(InjectableFixture $product, CmsIndex $cmsIndex, CatalogCategoryView $catalogCategoryView, array $prices)
{
$cmsIndex->open();
$cmsIndex->getTopmenu()->selectCategory($product->getCategoryIds()[0]);
$formPrices = $this->getFormPrices($product, $catalogCategoryView);
$fixturePrices = $this->prepareFixturePrices($prices);
$diff = $this->verifyData($fixturePrices, $formPrices);
\PHPUnit_Framework_Assert::assertEmpty($diff, $diff . "\n On: " . date('l jS \\of F Y h:i:s A'));
}
开发者ID:hientruong90,项目名称:ee_14_installer,代码行数:19,代码来源:AssertCatalogPriceRuleAppliedInCatalogPage.php
示例10: processAssert
/**
* Assert that the correct option details are displayed on the "View Details" tool tip.
*
* @param CmsIndex $cmsIndex
* @param WishlistIndex $wishlistIndex
* @param InjectableFixture $product
* @param FixtureFactory $fixtureFactory
* @return void
*/
public function processAssert(CmsIndex $cmsIndex, WishlistIndex $wishlistIndex, InjectableFixture $product, FixtureFactory $fixtureFactory)
{
$cmsIndex->getTopLinksBlock()->openAccount();
$cmsIndex->getLinksBlock()->openLink("My Wishlist");
$actualOptions = $wishlistIndex->getItemsBlock()->getItemProductBlock($product)->getOptions();
$cartFixture = $fixtureFactory->createByCode('cart', ['data' => ['items' => ['products' => [$product]]]]);
$expectedOptions = $this->prepareOptions($cartFixture);
$errors = $this->verifyData($expectedOptions, $this->sortDataByPath($actualOptions, '::title'));
\PHPUnit_Framework_Assert::assertEmpty($errors, $errors);
}
开发者ID:chucky515,项目名称:Magento-CE-Mirror,代码行数:19,代码来源:AssertProductDetailsInWishlist.php
示例11: processAssert
/**
* Assert that created CMS block displayed on frontend category page (in order to assign block to category:
* go to category page> Display settings> CMS Block).
*
* @param CmsIndex $cmsIndex
* @param CmsBlock $cmsBlock
* @param CatalogCategoryView $catalogCategoryView
* @param FixtureFactory $fixtureFactory
* @return void
*/
public function processAssert(CmsIndex $cmsIndex, CmsBlock $cmsBlock, CatalogCategoryView $catalogCategoryView, FixtureFactory $fixtureFactory)
{
$category = $fixtureFactory->createByCode('catalogCategory', ['dataSet' => 'default_subcategory', 'data' => ['display_mode' => 'Static block and products', 'landing_page' => $cmsBlock->getTitle()]]);
$category->persist();
$cmsIndex->open();
$cmsIndex->getTopmenu()->selectCategory($category->getName());
$categoryViewContent = $catalogCategoryView->getViewBlock()->getText();
$cmsBlockContent = explode("\n", $categoryViewContent);
\PHPUnit_Framework_Assert::assertContains($cmsBlock->getContent(), $cmsBlockContent);
}
开发者ID:chucky515,项目名称:Magento-CE-Mirror,代码行数:20,代码来源:AssertCmsBlockOnCategoryPage.php
示例12: processAssert
/**
* Assert that product is absent in the category page.
*
* @param CatalogCategoryView $catalogCategoryView
* @param CmsIndex $cmsIndex
* @param InjectableFixture $product
* @param CatalogCategory $category
* @return void
*/
public function processAssert(CatalogCategoryView $catalogCategoryView, CmsIndex $cmsIndex, InjectableFixture $product, CatalogCategory $category)
{
$cmsIndex->open();
$cmsIndex->getTopmenu()->selectCategory($category->getName());
$isProductVisible = $catalogCategoryView->getListProductBlock()->isProductVisible($product);
while (!$isProductVisible && $catalogCategoryView->getBottomToolbar()->nextPage()) {
$isProductVisible = $catalogCategoryView->getListProductBlock()->isProductVisible($product);
}
\PHPUnit_Framework_Assert::assertFalse($isProductVisible, 'Product is present on category page.');
}
开发者ID:chucky515,项目名称:Magento-CE-Mirror,代码行数:19,代码来源:AssertProductOutOfStockOnCategory.php
示例13: processAssert
/**
* Assert that Compare Products block is presented on CMS pages.
* Block contains information about compared products.
*
* @param CmsIndex $cmsIndex
* @param FixtureFactory $fixtureFactory
* @param Browser $browser
* @param array $products
* @return void
*/
public function processAssert(CmsIndex $cmsIndex, FixtureFactory $fixtureFactory, Browser $browser, array $products)
{
$newCmsPage = $fixtureFactory->createByCode('cmsPage', ['dataSet' => '3_column_template']);
$newCmsPage->persist();
$browser->open($_ENV['app_frontend_url'] . $newCmsPage->getIdentifier());
foreach ($products as &$product) {
$product = strtolower($product->getName());
}
\PHPUnit_Framework_Assert::assertEquals($products, $cmsIndex->getCompareBlock()->getProducts(), 'Compare product block contains NOT valid information about compared products.');
}
开发者ID:chucky515,项目名称:Magento-CE-Mirror,代码行数:20,代码来源:AssertProductCompareBlockOnCmsPage.php
示例14: processAssert
/**
* Assert that products are present in custom wishlist.
*
* @param CmsIndex $cmsIndex
* @param Wishlist $multipleWishlist
* @param WishlistIndex $wishlistIndex
* @param InjectableFixture[] $products
* @param int[]|null $qtyToAction
* @return void
*/
public function processAssert(CmsIndex $cmsIndex, Wishlist $multipleWishlist, WishlistIndex $wishlistIndex, array $products, $qtyToAction = null)
{
$this->wishlistIndex = $wishlistIndex;
$cmsIndex->getTopLinksBlock()->openAccount();
$cmsIndex->getLinksBlock()->openLink("My Wishlist");
$wishlistIndex->getManagementBlock()->selectWishlist($multipleWishlist);
foreach ($products as $key => $product) {
$expectedQty = $qtyToAction !== null && isset($qtyToAction[$key]) ? $qtyToAction[$key] : null;
$this->verifyItemProduct($product, $expectedQty);
}
}
开发者ID:QiuLihua83,项目名称:magento-ee,代码行数:21,代码来源:AssertProductsInCustomWishlist.php
示例15: processAssert
/**
* Assert that after applying changes, currency symbol changed on Catalog page.
*
* @param CmsIndex $cmsIndex
* @param CatalogCategoryView $catalogCategoryView
* @param CatalogProductSimple $product
* @param CurrencySymbolEntity $currencySymbol
* @return void
*/
public function processAssert(CmsIndex $cmsIndex, CatalogCategoryView $catalogCategoryView, CatalogProductSimple $product, CurrencySymbolEntity $currencySymbol)
{
$categoryName = $product->getCategoryIds()[0];
$cmsIndex->open();
$cmsIndex->getCurrencyBlock()->switchCurrency($currencySymbol);
$cmsIndex->getTopmenu()->selectCategory($categoryName);
$price = $catalogCategoryView->getListProductBlock()->getPrice($product->getId());
preg_match('`(.*?)\\d`', $price, $matches);
$symbolOnPage = isset($matches[1]) ? $matches[1] : null;
\PHPUnit_Framework_Assert::assertEquals($currencySymbol->getCustomCurrencySymbol(), $symbolOnPage, 'Wrong Currency Symbol is displayed on Category page.');
}
开发者ID:hientruong90,项目名称:ee_14_installer,代码行数:20,代码来源:AssertCurrencySymbolOnCatalogPage.php
示例16: processAssert
/**
* Assert that out of stock product is visible in the assigned category.
*
* @param CatalogCategoryView $catalogCategoryView
* @param CmsIndex $cmsIndex
* @param InjectableFixture $product
* @param CatalogCategory|null $category
* @return void
*/
public function processAssert(CatalogCategoryView $catalogCategoryView, CmsIndex $cmsIndex, InjectableFixture $product, CatalogCategory $category = null)
{
$categoryName = $product->hasData('category_ids') ? $product->getCategoryIds()[0] : $category->getName();
$cmsIndex->open();
$cmsIndex->getTopmenu()->selectCategory($categoryName);
$isProductVisible = $catalogCategoryView->getListProductBlock()->isProductVisible($product);
while (!$isProductVisible && $catalogCategoryView->getBottomToolbar()->nextPage()) {
$isProductVisible = $catalogCategoryView->getListProductBlock()->isProductVisible($product);
}
\PHPUnit_Framework_Assert::assertTrue($isProductVisible, "Product is absent on category page.");
}
开发者ID:chucky515,项目名称:Magento-CE-Mirror,代码行数:20,代码来源:AssertProductOutOfStockVisibleInCategory.php
示例17: processAssert
/**
* Assert that product can be found via Quick Search using searchable product attributes label.
*
* @param CatalogsearchResult $catalogSearchResult
* @param CmsIndex $cmsIndex
* @param InjectableFixture $product
* @param CatalogProductAttribute $attribute
* @return void
*/
public function processAssert(CatalogsearchResult $catalogSearchResult, CmsIndex $cmsIndex, InjectableFixture $product, CatalogProductAttribute $attribute)
{
$cmsIndex->open();
$filter = $this->prepareFilter($product, $attribute);
$cmsIndex->getSearchBlock()->search($filter);
$isProductVisible = $catalogSearchResult->getListProductBlock()->isProductVisible($product);
while (!$isProductVisible && $catalogSearchResult->getBottomToolbar()->nextPage()) {
$isProductVisible = $catalogSearchResult->getListProductBlock()->isProductVisible($product);
}
\PHPUnit_Framework_Assert::assertTrue($isProductVisible, 'Product was not found by option label.');
}
开发者ID:cewolf2002,项目名称:magento,代码行数:20,代码来源:AssertProductAttributeSearchableByLabel.php
示例18: processAssert
/**
* Assert that product available by new URL on the frontend.
*
* @param Browser $browser
* @param UrlRewrite $urlRewrite
* @param CatalogProductSimple $product
* @param CatalogProductView $catalogProductView
* @param CmsIndex $cmsIndex
* @param Cache $cachePage
* @return void
*/
public function processAssert(Browser $browser, UrlRewrite $urlRewrite, CatalogProductSimple $product, CatalogProductView $catalogProductView, CmsIndex $cmsIndex, Cache $cachePage)
{
$cachePage->open()->getPageActions()->flushCacheStorage();
if ($urlRewrite->hasData('store_id')) {
$storePath = explode('/', $urlRewrite->getStoreId());
$cmsIndex->open();
$cmsIndex->getHeaderBlock()->selectStore($storePath[2]);
}
$browser->open($_ENV['app_frontend_url'] . $urlRewrite->getRequestPath());
\PHPUnit_Framework_Assert::assertEquals($catalogProductView->getViewBlock()->getProductName(), strtoupper($product->getName()), 'URL rewrite product redirect false.');
}
开发者ID:hientruong90,项目名称:ee_14_installer,代码行数:22,代码来源:AssertUrlRewriteProductRedirect.php
示例19: processAssert
/**
* Assert that Catalog Price Rule is applied & it impacts on product's discount price on Product page.
*
* @param InjectableFixture $product
* @param CatalogProductView $pageCatalogProductView
* @param CmsIndex $cmsIndex
* @param CatalogCategoryView $catalogCategoryView
* @param array $prices
* @return void
*/
public function processAssert(InjectableFixture $product, CatalogProductView $pageCatalogProductView, CmsIndex $cmsIndex, CatalogCategoryView $catalogCategoryView, array $prices)
{
$cmsIndex->open();
$cmsIndex->getTopmenu()->selectCategory($product->getCategoryIds()[0]);
$catalogCategoryView->getListProductBlock()->openProductViewPage($product->getName());
$productPriceBlock = $pageCatalogProductView->getViewBlock()->getPriceBlock();
$actualPrices['regular'] = $productPriceBlock->getRegularPrice();
$actualPrices['special'] = $productPriceBlock->getSpecialPrice();
$actualPrices['discount_amount'] = number_format($actualPrices['regular'] - $actualPrices['special'], 2);
$diff = $this->verifyData($actualPrices, $prices);
\PHPUnit_Framework_Assert::assertEmpty($diff, $diff);
}
开发者ID:cewolf2002,项目名称:magento,代码行数:22,代码来源:AssertCatalogPriceRuleAppliedInProductPage.php
示例20: processAssert
/**
* Assert that created Order By Sku widget displayed on frontend in Catalog.
*
* @param CatalogCategory $category
* @param CmsIndex $cmsIndex
* @param CatalogCategoryView $catalogCategoryView
* @param Widget $widget
* @param Cache $adminCache
* @return void
*/
public function processAssert(CatalogCategory $category, CmsIndex $cmsIndex, CatalogCategoryView $catalogCategoryView, Widget $widget, Cache $adminCache)
{
$category->persist();
// Flush cache
$adminCache->open();
$adminCache->getPageActions()->flushCacheStorage();
$adminCache->getMessagesBlock()->waitSuccessMessage();
$cmsIndex->open();
$cmsIndex->getTopmenu()->selectCategory($category->getName());
$errors = $catalogCategoryView->getWidgetView()->checkWidget($widget, "Order by SKU");
\PHPUnit_Framework_Assert::assertEmpty($errors, $errors);
}
开发者ID:MikeTayC,项目名称:magento.dev,代码行数:22,代码来源:AssertWidgetOrderBySkuOnCategoryPage.php
注:本文中的mage\cms\test\page\CmsIndex类示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论