Can't show the image in slider with yii2 - image

I have code to show view like this
<div class="col-md-10">
<div class="col-md-4">
<?php
$items = [];
foreach ($team->gallery as $item){
$items[] = [
'content' => '<img style="width:300px;" src="'.$item->filepath.'"/>',
'caption' => '<h4>'.$item->name.'</h4><p>'.$item->description.'</p>',
];
}
echo Carousel::widget([
'items' => $items,
]);
?>
</div>
and model for get galery like this
public function getLeague(){
return $this->hasOne(Leagues::className(), ['id' => 'league_id']);
}
public function getGallery(){
return $this->hasMany(TeamGalleries::className(), ['team_id' => 'id']);
}
but i can't get the filepath in my databases therefore i can't show my picture in my website, how to solved this problem?
i use yii2 and the folder upload for my picture is in web folder in yii2 basic

If your images are within the web folder you can easily use the Yii aliases, which have one entry for this folder: #web.
// Replace this
'<img style="width:300px;" src="'.$item->filepath.'"/>'
// with
'<img style="width:300px;" src="' . Yii::getAlias('#web') . '/' . $item->filepath . '"/>'
Further information about aliases in the guide.

Related

Cannot fetch image from storage directory in laravel

The image is not shown when I display it in the index page.
My view file (index.blade.php):
<div class="row">
#if(App\News::count() > 0)
#foreach($news as $n)
<div class="col-md-8 panel border-right">
<br />
<img src="{{ asset('storage/images/news/'. $n->image) }}" width="200px" height="100px">
--$n->image returns News_1.jpg which is the image name stored in the storage directory.
<h1>First Div</h1>
</div>
#endforeach
#endif
<div class="col-md-4">
<h1>Second Div</h1>
</div>
</div>
My controller:
public function store(Request $request)
{
$this->validate($request,
[
'head' => 'required|max:191',
'title' => 'required|max:191',
'body' => 'required',
'pic' => 'required'
]);
$filename="";
$extension="";
if($request->hasFile('pic'))
{
if((News::orderBy('id', 'desc')->first()) != null)
{
$id = ((News::orderBy('id', 'desc')->first()->id)+1);
$filename = "News_" . $id;
}
else
{
$filename = "News_" . 1;
}
$extension = $request->pic->getClientOriginalExtension();
$filename = $filename . "." . $extension;
//return $request->pic->getClientOriginalName();
$request->pic->storeAs('public/images/news', $filename);
}
else
{
return redirect()->back()->withInput(Input::all())->withErrors(['message' => 'Please select a valid file.']);
}
$news = new News;
$news->head = $request->head;
$news->title = $request->title;
$news->body = $request->body;
$news->image = $filename;
$news->save();
Session::flash('success', 'The record was successfully saved.');
return redirect()->route('news.index');
}
I have already linked the storage directory with the public directory:
My directory structure:
The images are stored properly in both the Application and database but it cannot be displayed properly, when I run the app, I get the following view:
When open the image in new tab, I see the following address bar:
This is the local driver configuration:
Any help is appreciated in advance.
If your current route is /cricket and you reference an image with 'storage/images/news/news1.jpg' then the web browser is going to assume that this image is relative to the cricket resource.
Your image src needs to start with either the full URL or a / to indicate it is relative to the root folder
In this case I would hard code the URL since you have hard coded it in the asset helper anyway
<img src="/storage/images/news/{{ $n->image }}"
You can try setting your local driver to something like this:
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],

Yii2 how to send controller action response without redirect?

I have a Single page application in Yii2
the main page contains
1. a column with a list of objects + create button
2. a column for dynamic content of create/update forms
My problem is when loading (through ajax) a create form, and then I am sending data through AjaxSubmitButton which woks fine (db updated) but instead of changing the dynamic content area with the new object data it redirects to a view partial form.
How can I make the new response go into the same div that it is being sent from?
this is the form that is loaded now in #singleObjContainer
<div class="course-form">
<?php
$form = yii\bootstrap\ActiveForm::begin();
?>
<span>
<h4 class='listTitle'>Add Course</h4>
</span>
<span class="form-group pull-right">
<?php
AjaxSubmitButton::begin([
'label' => 'Save',
'ajaxOptions' => [
'type'=>'POST',
'url'=> Url::toRoute(['course/create-form']),
'success' => new \yii\web\JsExpression('function(html)
{
$("#singleObjContainer").empty().append(html);
}'),
],
'options' => ['class' => 'btn btn-success', 'type' => 'submit'],
]);
AjaxSubmitButton::end();
?>
</span>
<hr class='myHr'>
<div>
<?php
echo $form->field($model, 'name')->textInput(['maxlength' => true]);
echo $form->field($model, 'description')->textarea(['rows' => '4']);
echo $form->field($model, 'img')->label(Html::img(Yii::getAlias('#uploadsUrl/').'courses/'.$model->img,['width' => '30%']),['encodeLabel' => false])->fileInput();
?>
</div>
<?php ActiveForm::end(); ?>
and this is the controller action:
public function actionCreateForm()
{
$model = new Course();
if ( $model->load(Yii::$app->request->post()))
{
// get the instance of the image
$image = UploadedFile::getInstance( $model, 'img');
// save image name to the model
$model->img = $image->baseName.".".$image->extension;
// go through validation rule and save
if( $model->save() )
{
// validation ok, save image in the file system
$image->saveAs( Yii::getAlias('#uploads/').'courses/'.$model->img);
// load the details view into the singleObj container
$courseStudents = $this->getCourseStudents($model['id']);
return $this->renderPartial('_viewForm', ['model' => $model, 'courseStudents' => $courseStudents]);
}
}
else
{
return $this->renderPartial('_createForm', ['model' => $model,]);
}
}
If you need that your result is send directly to the ajax request .. just return .. eventually using a json_encode for the array.
return json_encode( $model);
this way you obtain a json answer with struct equivalent to your $model
In your controller add a proper action
public function actionRefreshForm()
{
//your appllication code
$my_new_html_code ='<div>test new html code </div>;
return $my_new_html_code;
}
In your ajaxOptions call the related action
'ajaxOptions' => [
'type'=>'POST',
'url'=> Url::toRoute(['course/refresh-form']),
'success' => new \yii\web\JsExpression('function(html)
{
$("#singleObjContainer").empty().append(html);
}'),
],
You can use yii\widgets\Pjax. It will be easy for you I guess. You can learn more about it in this article. http://blog.neattutorials.com/yii2-pjax-tutorial.

Yii's default ajax is not working

In my Yii application, Yii's default Ajax is not working. Also default Ajax validation is not working. Has this been an installation problem or any other problem. How to enable Yii's default Ajax.
In my controller,
public function actionCreate() {
$model = new Company;
// Uncomment the following line if AJAX validation is needed
$this->performAjaxValidation($model);
if (isset($_POST['Company'])) {
$company = Company::model()->findAll();
if (count($company) === 0) {
$model->attributes = $_POST['Company'];
$uploadedFile = CUploadedFile::getInstance($model, 'logo');
if (isset($uploadedFile)) {
$fileName = date('Ymdhis') . '_' . $uploadedFile->name; // $timestamp + file name
$model->logo = $fileName;
}
if ($model->validate()) {
if ($model->save()) {
if (isset($uploadedFile)) {
$uploadedFile->saveAs(Yii::app()->basePath . '/../banner/' . $fileName);
}
$this->redirect(array('create'));
}
}
} else {
Yii::app()->user->setFlash('error', 'Company details is already exists.');
}
}
$this->render('create', array(
'model' => $model,
));
}
In view page,
<?php
$form = $this->beginWidget('CActiveForm', array(
'id' => 'company-form',
'enableClientValidation' => true,
'clientOptions' => array(
'validateOnChange' => true,
'validateOnSubmit' => true,
),
// Please note: When you enable ajax validation, make sure the corresponding
// controller action is handling ajax validation correctly.
// There is a call to performAjaxValidation() commented in generated controller code.
// See class documentation of CActiveForm for details on this.
'enableAjaxValidation' => true,
'htmlOptions' => array('enctype' => 'multipart/form-data'),
));
?>
<div class="form-group">
<?php echo $form->label($model, 'company_name', array('class' => 'req')); ?>
<?php echo $form->textField($model, 'company_name', array('class' => 'form-control')); ?>
<?php echo $form->error($model, 'company_name', array('class' => 'school_val_error')); ?>
</div>
Please help me.
Thanks...
Yii has no default AJAX. This is a technology based on JavaScript language. By default Yii includes a jQuery library which provided some methods for easy manipulations with AJAX. If you want use it on your page, you should add this string:
Yii::app()->clientScript->registerCoreScript('jquery');
You can add this string to your main layout, for example into top of /views/layouts/main.php`

how to display an image

In Zend Framework I'm trying to display an image through my controller.
class PictController extends Zend_Controller_Action
{
public function indexAction()
{
$objpict = new Application_Model_Page();
$objpict->CheminPictures(Application_Model_String::ExtractNamePict($this->getParam('niveau0')));
$this->_helper->viewRenderer->setNoRender(true);
$this->_helper->getHelper('layout')->disableLayout();
header('Content-Type: image/jpeg');
header('Content-Length: ' . filesize($file));
echo file_get_contents($file);
exit;
}
}
A road was also created, but it is not taken into account either!
$routeRegex = new Zend_Controller_Router_Route_Regex(
'img/([a-z-0-9-/-]+).jpg',
array('controller' =>'pict','action' => 'index'),
array(1 => 'niveau0',2 => 'niveau1',3 => 'niveau2'),'img/%s.jpg');
$this->_routeur->addRoute('routeimage', $routeRegex);
This does not work. It returns me the url of my page ...
<img alt="montitre" src="<?php echo $this->url(array('controller' => 'pict', 'action' => 'index')); ?>" >
How to call the controller from my sight so that it returns me the information?
Thank'you very much !
++
ps: sorry for English

Displaying form validation errors in a template (Symfony)

let's say I have a blog with a module "post".
now I display a post like this: post/index?id=1
in the index-action i generate a new CommentForm and pass it as $this->form to the template and it is being displayed at the bottom of a post (it's just a textfield, nothing special). form action is set to "post/addcomment". How can I display the validation errors in this form? using setTemplate('index') doesn't work because I would have to pass the id=1 to it...
thanks
UPDATE:
here's a sample code:
public function executeIndex(sfWebRequest $request)
{
$post = Doctrine::getTable('Posts')->find($request->getParameter('id'));
$this->post = $post->getContent();
$comments = $post->getComment();
if ($comments->count() > 0)
$this->comments = $comments;
$this->form = new CommentForm();
$this->form->setDefault('pid', $post->getPrimaryKey());
}
public function executeAddComment(sfWebRequest $request) {
$this->form = new CommentForm();
if ($request->isMethod('post') && $request->hasParameter('comment')) {
$this->form->bind($request->getParameter('comment'));
if ($this->form->isValid()) {
$comment = new Comment();
$comment->setPostId($this->form->getValue('pid'));
$comment->setComment($this->form->getValue('comment'));
$comment->save();
$this->redirect('show/index?id='.$comment->getPostId());
}
}
}
and my Comment Form:
class CommentForm extends BaseForm {
public function configure() {
$this->setWidgets(array(
'comment' => new sfWidgetFormTextarea(),
'pid' => new sfWidgetFormInputHidden()
));
$this->widgetSchema->setNameFormat('comment[%s]');
$this->setValidators(array(
'comment' => new sfValidatorString(
array(
'required' => true,
'min_length' => 5
),
array(
'required' => 'The comment field is required.',
'min_length' => 'The message "%value%" is too short. It must be of %min_length% characters at least.'
)),
'pid' => new sfValidatorNumber(
array(
'required' => true,
'min' => 1,
'max' => 4294967295
),
array(
'required' => 'Some fields are missing.'
))
));
}
}
and finally, indexSuccess:
<?php echo $post; ?>
//show comments (skipped)
<h3>Add a comment</h3>
<form action="<?php echo url_for('show/addComment') ?>" method="POST">
<table>
<?php echo $form ?>
<tr>
<td colspan="2">
<input type="submit" />
</td>
</tr>
</table>
</form>
that's it.
If you're using sf 1.4 just put executeAddComments and executeIndex together in one function (executeIndex for example) and you'll be fine. setTemplate won't work here.
Are you using the handleError method in the action ? The id=1 part of your url should not change if inside the handleError method, you do a return sfView::SUCCESS;
UPDATE:
It actually changes, what you need to do is submit the id along with the comment [Which I'm sure you're already doing because a comment that doesn't refer to a post doesn't make much sense], then in your handleError method, instantiate the post object there.
Try to change your form action to
<?php echo url_for('show/addComment?id=' . $post->getId()) ?>
Doing this, your post id parameter should be available even on your post request, and it should work with setTemplate('index') or forward at the end of executeAddComment

Resources